前提:此文全是自己学习的理解,肯定有错误的地方,或者直接就是理解错了,走了歪路。
书籍:深度学习入门–基于python的理论与实现 ( 斋藤康毅著 )
初读感受:通过各种层的叠加,尽管不知道为什么经过这些处理,会对图像 ( MNIST集 )产生这么高的辨识能力,能够通过梯度这一数理上的概念使各层不断学习以提高准确度。是图形通过像素和数学发生关系吗?但是毫无疑问的是,准确度确实在一步步的提升,这些层的作用对于初读之后的我还像黑盒一样。还需要不断研读,搞清楚他们的作用。或者本来深度学习的层叠加产生的效果就是让人脑无法理解的?
再读感受
上图是一个有推理和学习的神经网络,将其分为三段进行分析
如下图
①:
-
输入层–图像 将 每个像素算作一个神经元,里面包含RGB,灰度值等信息。比如MNIST集中每张图片是28*28,所以图集中一张图就输入784个神经元。
-
每层初始权重的设置:为了抑制过拟合,提高泛化能力,要使用权值衰减的技巧。权值衰减就是以减小权重参数的值为目的的学习的方法。要尽量开始时为较小的值,但设置为0则不能正常学习( 权重为0反向传播时会出问题 ),所以直接设置为标准差为0.01的高斯分布值
0.01 * np.random.randn(10,100)
。
②:
a.
从左到右:
第一层:Affine() 加权总和层
第二层:sigmoid() 激活函数层
第三层:Affine() 加权总和层
第四层:sigmoid() 激活函数层
第五层:Affine() 加权总和层
Affine()前都是有权重计算,sigmoid()层都是对加权总和值的转换
权重是各信号神经元重要性的反映,权重越大,对最后结果的影响越大。
用sigmoid()或者ReLu()做激活函数是为了平滑性
从感知机可以得出是与非的结果,不断训练可以让划分越来越准确
但是最大的问题就是,在日常生活中很多时候是无法给出一定的对立关系的,所以如果训练识别猫的模型只能给它猫的照片,即肯定一侧的数据,可能会使如下情况发生
所以感知机向神经网络转变的关键点就是激活函数的变化,将是与非转变为好与坏,即这个图片有多像猫,而不是这张图片是不是猫。
b.
第②部分结束之后得到的是得分,即这张图片对应0-9这十个数字,更像谁。得分越高证明这个神经网络下的匹配度越高。
到这里神经网络的推理部分就结束了。
如果是用的高斯分布的初始权重,我觉的推理出来的结果可能和正常结果相差特别大。这边也滋生了一个我最大的疑问。
③:
a.
第③部分是学习的重要部分
将得分传入softmax层,正规化和统一化之后得出0-1之间的数,这边就是10个数,而且他们的和是1,即可以看成是概率的概念。我的理解是这个图片对应每个数字的概率,概率越大证明越有可能是这个数。
注意:为什么推理到②就结束了呢?
因为softmax层并不会改变得分多少的排列顺序,得分越高,相应的概率也就越大。softmax层这边是为了和后面的损失函数交叉熵函数配合使用,即softmax-with-loss。
b.
学习数据中监督数据是one-hot形式,即只有正确的对应项是1,其他都是0
交叉熵函数输出的误差的是由正确标签所对应的输出结果决定的,正确解经过了softmax层后的输出结果越大,经过该损失函数后值越小,也就是误差越小。
c.
该模型的结构就是推理+学习来不断提高准确率
学习目的:让损失函数值更小
学习方法:随机梯度下降法,使神经网络找到权重和偏置的最优参数。
SGD随机梯度下降法如何实现:
首先在用数理计算的方法便于理解,梯度指示的方向是各点函数值减少最多的方向,虽然梯度的方向不一定指向最小值,但是沿着它的方向能最大限度地减少函数的值。所以,在寻找函数最小值的位置时,以梯度为线索,决定前进的方向。
通过不断沿梯度方向前进,逐渐减小函数值的过程就是梯度法。
而对随机选取的小批量数据进行的梯度下降法,就是随机梯度下降法(神经网络中参数太多,小批量可以加快更新速度)。
神经网络的梯度:损失函数关于权重参数的梯度。即
ϑ
L
ϑ
W
=
(
ϑ
L
ϑ
w
11
ϑ
L
ϑ
w
12
ϑ
L
ϑ
w
13
ϑ
L
ϑ
w
21
ϑ
L
ϑ
w
22
ϑ
L
ϑ
w
23
)
\frac{\vartheta L}{\vartheta W} = \begin{pmatrix} \frac{\vartheta L}{\vartheta {w_{11}}} & \frac{\vartheta L}{\vartheta w_{12}} & \frac{\vartheta L}{\vartheta w_{13}} \\ \\ \frac{\vartheta L}{\vartheta w_{21}} &\frac{\vartheta L}{\vartheta w_{22}} & \frac{\vartheta L}{\vartheta w_{23}}\\ \end{pmatrix}
ϑWϑL=⎝⎛ϑw11ϑLϑw21ϑLϑw12ϑLϑw22ϑLϑw13ϑLϑw23ϑL⎠⎞
权重w中任意一个发生变化,损失函数的值都可能发生变化,即②的得分以及softmax层的概率都会发生变化,观察 ϑ L ϑ W \frac{\vartheta L}{\vartheta W} ϑWϑL就可以知道权重w时向正方向还是负方向变化会使损失函数L变小。
如下,
η
{\eta}
η是学习率,即决定每次权重参数的更新量。
w
w
w向偏导方向变化,变化程度由
η
{\eta}
η控制,当找到"洼地"的时候,偏导趋于0,相应的变化也就停止了,代表可能找到了最小值。
w
11
=
w
11
−
η
ϑ
L
ϑ
w
11
w_{11} = w_{11} - {\eta}{\frac{\vartheta L}{\vartheta w_{11}} }
w11=w11−ηϑw11ϑL
基于数理计算求梯度计算非常低效,每次要有众多的权重参数要参与到求梯度,非常复杂,所以就可以使用误差反向传播法提高效率,具体看书即可。
使用softmax-with-loss这样的组合(softmax+交叉熵误差)也是为了反向传播之后得到类似
(
y
1
−
t
1
,
y
2
−
t
2
,
y
3
−
t
3
)
(y_1-t_1,y_2-t_2,y_3-t_3)
(y1−t1,y2−t2,y3−t3)这样漂亮的结果,即神经网络输出与监督标签的误差高效的传递给前面的层。
学习中最大的疑问
问题:经过加权相加再经过激活函数的组合到底在怎么发挥作用?换句话说就是中间的隐藏层它的作用是什么?
我的思考:
用高斯分布的权重做初始值,图片的各种特征经过一次加权相加激活,加权相加激活后的正确项得分可能非常低,导致损失函数值非常大,此时只需要求出各权重的梯度,更新权重。
也许加权相加再激活只是为了随意得出一个结果,这个结果一开始也不是为了求图形中的数字,它也不管输入是什么,它只是将图片的像素神经元做了一次处理,然后得出一个他也不知道干嘛用的结果,但是当监督标签出现之后,他这样的结果表现的很差,也就是正确项得分太低,他自己肯定是不在乎的。
但是我们知道我们的目的是提高准确度,这也就是我们要设置学习,让隐藏层里的权重参数进行调整,所以隐藏层里的工作对我们来说就是黑盒,里面的作用和参数调整我们也不得而知,但是唯一知道就是他会越来越好。
至于很多层一起用可能是为了让里面的参数更多,做的变换更多,内部更复杂,更便于描述图片,从而使准确度上升,或者可能一层没办法描述非线性问题,两层以上才能描述非线性问题。