手搓人工神经网络
手搓人工神经网络
人工神经网络实质上就是一个含参的函数。在使用时直接计算出结果,在训练时调整参数。
我们先不看真正的人工神经网络,考虑一个简单的一次函数:
y = k x y = kx y=kx
现在给你一组数据,这组数据反映了一辆匀速行驶的汽车的时间(x)和路程(y)的关系:
时间 | 路程 |
---|---|
1 | 60 |
2 | 120 |
3 | 180 |
4 | 240 |
现在需要设置上述一次函数的参数(k),使得当这个函数的自变量(x)为时间时,函数值(y)是路程。相信大家一眼就能看出来 k = 60 k=60 k=60
看出来 k = 60 k=60 k=60 的过程就是训练,计算 y ∣ x = t y | _{x=t} y∣x=t (t是常数)的过程就是预测。
考虑一个简单的人工神经网络,如图所示:
我们来看这里面的参数: x i j x_{ {i}{j}} xij 表示第 j j j 层第 i i i 个输入, y i j y_{ {i}{j}} yij 表示第 j j j 层第 i i i 个输出, w i j t w_{ijt} wijt 表示第 t t t 层第 i {i} i 个输入到第 j j j层的输出的权重。
当我们向网络输入一个数据后(即设置 x 11 x_{11} x11 和 x 21 x_{21} x21 的值),我们就可以得到一个输出( y 12 y_{12} y12 和 y 22 y_{22} y22 )。这个输出的计算方法如下:
- 求第一层的输出:
{ y 11 = f ( w 111 x 11 + w 211 x 21 ) y 21 = f ( w 121 x 11 + w 221 x 21 ) \begin{cases} y_{11} = f(w_{111}x_{11} + w_{211}x_{21})\\ y_{21} = f(w_{121}x_{11} + w_{221}x_{21}) \end{cases} { y11=f(w111x11+w211x21)y21=f(w121x11+w221x21)
-
将第一层的输出作为第二层的输出传入:
{ x 12 = y 11 x 22 = y 21 \begin{cases} x_{12} = y_{11} \\ x_{22} = y_{21} \end{cases} { x12=y11x22=y21 -
求第二层的输出:
{ y 12 = f ( w 112 x 12 + w 212 x 22 ) y 22 = f ( w 122 x 12 + w 222 x 22 ) \begin{cases} y_{12} = f(w_{112}x_{12} + w_{212}x_{22})\\ y_{22} = f(w_{122}x_{12} + w_{222}x_{22}) \end{cases} { y12=f(w112x12+w212x22)y22=f(w122x12+w222x22)
最终网络的输出结果就是 ( y 12 , y 22 ) (y_{12}, y_{22}) (y12,y22)
在这里面,函数 f ( x ) f(x) f(x) 称为激活函数。为什么需要激活函数呢?我们考虑若没有激活函数的情况:
{ y 12 = w 112 x 12 + w 212 x 22 = w 112 ( w 111 x 11 + w 211 x 21 ) + w 212 ( w 121 x 11 + w 221 x 21 ) y 22 = w 122 x 12 + w 222 x 22 = w 122 ( w 111 x 11 + w 211 x 21 ) + w 222 ( w 121 x 11 + w 221 x 21 ) \begin{cases} y_{12}=w_{112}x_{12}+w_{212}x_{22}=w_{112}(w_{111}x_{11}+w_{211}x_{21})+w_{212}(w_{121}x_{11}+w_{221}x_{21})\\ y_{22}=w_{122}x_{12}+w_{222}x_{22}=w_{122}(w_{111}x_{11}+w_{211}x_{21})+w_{222}(w_{121}x_{11}+w_{221}x_{21}) \end{cases} {
y12=w112x12+w212x22=w