快捷搜索:  汽车  科技

神经网络学习规则学习笔记(神经网络原来这么简单)

神经网络学习规则学习笔记(神经网络原来这么简单)“神经网络”一词很流行,人们通常认为它很难,但其实要简单得多。作者说,神经网络并不复杂!专为基础为零的初学者打造。有基础的同学,也可以来看看加深一下理解。我们就以神经网络为例先来一睹为快吧!

白交 发自 凹非寺
量子位 报道 | 公众号 QbitAI

你想学机器学习吗?这里有一个入门贴适合你。

什么神经网络、随机森林、计算机视觉通通一网打尽。

这个Facebook软件工程师做了一个入门贴。

专为基础为零的初学者打造。

有基础的同学,也可以来看看加深一下理解。

神经网络学习规则学习笔记(神经网络原来这么简单)(1)

我们就以神经网络为例先来一睹为快吧!

神经网络概论

作者说,神经网络并不复杂!

“神经网络”一词很流行,人们通常认为它很难,但其实要简单得多。

是不是这样呢?先看再说。

神经网络的理解主要分为三个部分,神经元、神经网络的构建、训练神经网络。

神经元——神经网络的基本单元


神经网络学习规则学习笔记(神经网络原来这么简单)(2)


这是2-input神经元的样子。

首先神经元接受输入x1、x2,进行一些数学运算以后,然后产生一个输出y。

在神经元里,通常会发生三件事:

1、每个输入乘以相应的权重;

神经网络学习规则学习笔记(神经网络原来这么简单)(3)

2、将所有加权输入加在一起,在加上一个偏差b;

神经网络学习规则学习笔记(神经网络原来这么简单)(4)

3、导入一个激活函数,得到输出y。

神经网络学习规则学习笔记(神经网络原来这么简单)(5)

通常来说,激活函数使用Sigmoid函数,也就是常说的S型函数,输入任意值(-∞, ∞),最后输出都能停留在0-1之间。

神经网络学习规则学习笔记(神经网络原来这么简单)(6)

对此,他还举了一个简单的例子。

以激活函数是S型函数、2输入神经元为例,设置参数 w=[0 1] (w1=0,w2=1),b=4。

input:x=[2 3]

output:y=0.999

神经网络学习规则学习笔记(神经网络原来这么简单)(7)

这也就是最为朴素的神经网络——前馈神经网络。

对此,作者还用Python实现了整个过程。

importnumpyasnp defsigmoid(x): #Ouractivationfunction:f(x)=1/(1 e^(-x)) return1/(1 np.exp(-x)) classNeuron: def__init__(self weights bias): self.weights=weights self.bias=bias deffeedforward(self inputs): #Weightinputs addbias thenusetheactivationfunction total=np.dot(self.weights inputs) self.bias returnsigmoid(total) weights=np.array([0 1])#w1=0 w2=1 bias=4#b=4 n=Neuron(weights bias) x=np.array([2 3])#x1=2 x2=3 print(n.feedforward(x))#0.9990889488055994


构建神经网络

神经元连接在一起就是神经网络。

神经网络学习规则学习笔记(神经网络原来这么简单)(8)

两个输入,一个含有两个神经元的隐藏层,一个含有1个神经元的输出层就构建了一个神经网络。

需要注意的是,可以用多层隐藏层。就比如,像这样:

神经网络学习规则学习笔记(神经网络原来这么简单)(9)

我们仍以上个示例的条件为例。

神经网络学习规则学习笔记(神经网络原来这么简单)(10)

一个神经网络可以包含任意数量的层和任意数量的神经元。

以Python代码示例如下:

importnumpyasnp #...codefromprevioussectionhere classOurNeuralNetwork: ''' Aneuralnetworkwith: -2inputs -ahiddenlayerwith2neurons(h1 h2) -anoutputlayerwith1neuron(o1) Eachneuronhasthesameweightsandbias: -w=[0 1] -b=0 ''' def__init__(self): weights=np.array([0 1]) bias=0 #TheNeuronclasshereisfromtheprevioussection self.h1=Neuron(weights bias) self.h2=Neuron(weights bias) self.o1=Neuron(weights bias) deffeedforward(self x): out_h1=self.h1.feedforward(x) out_h2=self.h2.feedforward(x) #Theinputsforo1aretheoutputsfromh1andh2 out_o1=self.o1.feedforward(np.array([out_h1 out_h2])) returnout_o1 network=OurNeuralNetwork() x=np.array([2 3]) print(network.feedforward(x))#0.7216325609518421


训练神经网路——计算损失函数

假设,我们正在处理以下这个项目。通过人员的体重和身高来判断性别。

神经网络学习规则学习笔记(神经网络原来这么简单)(11)

以weight、height作为输入,以gender作为输出。

神经网络学习规则学习笔记(神经网络原来这么简单)(12)

Male设置为0,Female设置为1,还对其余数据进行了简化。

神经网络学习规则学习笔记(神经网络原来这么简单)(13)

在训练神经网络之前,首先需要一个方法来量化它做得有多“好”,是否能够做得“更好”,那就是损失函数(loss)。

这里,我们将使用损失函数的一种——均方误差来计算。

神经网络学习规则学习笔记(神经网络原来这么简单)(14)

预测结果越好,说明损失也就会越低。而训练神经网络的目的,就在于尽可能的减少损失。

如果我们确信所有的人都是Male,也就是说预测值为0,会出现什么样的结果?

神经网络学习规则学习笔记(神经网络原来这么简单)(15)

Python示例:

importnumpyasnp defmse_loss(y_true y_pred): #y_trueandy_predarenumpyarraysofthesamelength. return((y_true-y_pred)**2).mean() y_true=np.array([1 0 0 1]) y_pred=np.array([0 0 0 0]) print(mse_loss(y_true y_pred))#0.5

训练神经网络——最小化损失

计算了损失函数之后,就需要将损失最小化,这也是训练神经网络的最终目的所在。

接下来帖子有一段多变量演算,涉及微积分。

作者表示,

如果对微积分不满意,可随时跳过。

简单起见,我们就假设这个数据集中只有Alice。

那么,它的损失函数就是这样。

神经网络学习规则学习笔记(神经网络原来这么简单)(16)

那么它的权重w跟偏差b,在图上标示,那么就有6个权重变量,3个偏差变量。

神经网络学习规则学习笔记(神经网络原来这么简单)(17)

于是,便将损失函数写为多变量函数。

神经网络学习规则学习笔记(神经网络原来这么简单)(18)

想象一下,我们只要调整w1,就可能导致L的变化。那具体是如何变化的呢?这就需要计算偏导数了。

神经网络学习规则学习笔记(神经网络原来这么简单)(19)

利用链式求导法则进行反向求导,而这一过程就叫做反向传播

详细计算过程就不放在这里了,大家去他个人网站去看哦~(链接已附文末)

作者温馨提示,看这个过程的时候不要着急,拿出手中的笔和纸,能够帮助你理解。

接下来,使用随机梯度下降的优化算法,公式表示如下(以w1为例):

神经网络学习规则学习笔记(神经网络原来这么简单)(20)

其中的“学习速率”控制着训练速度,过大或者过小都不合适。

如果我们将所有的变量都进行这样的优化,那么损失函数将逐渐减少,神经网络就能够得到改善。

神经网络学习规则学习笔记(神经网络原来这么简单)(21)

简单来说,整个训练过程是这样的:

1、数据集中选择一个样本,就如Alice。

2、利用反向传播计算所有变量的偏导数。

3、使用随机梯度下降来训练神经网络,更新变量。

4、返回步骤1。

神经网络的部分就介绍到这里,怎么样?看完之后,有什么感想?

是不是觉得神经网络也还好了。还有其他概念等着你来学习呢!

传送门

https://victorzhou.com/tag/machine-learning/

— 完 —

量子位 QbitAI · 头条号签约

关注我们,第一时间获知前沿科技动态

猜您喜欢: