台湾大学深度学习课程 学习笔记 lecture1-2 Neural Network Basics
以下内容和图片均来自台湾大学深度学习课程。
课程地址:https://www.csie.ntu.edu.tw/~yvchen/f106-adl/syllabus.html
本节课主要讲了三个问题:
1. What is the model? (function hypothesis set)
2. What does a “good” function mean?
3. How do we pick the “best” function?
为了回答这三个问题,引出了本节课的主要内容框架。
接下来针对上面的框架,做出了如下的讲解。本次笔记根据框架内容,从模型、损失函数、优化方法这三个完成。
模型
数字转化
输入数据
同样的,对输出结果
这样,在接下来的模型处理中,使用这些转化后的数字进行计算。
单层神经网络
上节讲到的单个神经元结构中,将bias
b 的意义
那么
如果没有
这个地方,台大原视频课程中,老师采用的下面的方式讲解,这里将
分类模型应用
在二分类中,例如判断图形是否为2,我们得到的结果为“is”和“not”的概率。一般认为大于0.5所对应的结果为最终预测的结果。
再多分类中,例如判断图形是0~9中的哪一个数字。每一个分类都能得到一组“is”和“not”的概率。由于数字之间具有一些相似性(例如5和6,在手写中图片中可能比较接近),导致最终结果中可能5和6的预测为“is”的概率都大于0.5。所以一般认为“is”的概率最大的那个所对应的为最终预测的结果。
单层的局限性
单层神经网络(无隐藏层),首先提到的就是没有共享权重,也就是说,每个输入的
模型过于简单的直接结果就是很多情况下,无法进行区分。直观的理解如下图,当出现第三种情况是,无法使用模型进行区分。
所以在实际应用中,我们往往需要多层神经网络,来增加模型的复杂度。
那么为什么增加层数后模型就能进行复杂的划分了呢?
针对上面第三个无法划分的图,我们使用两层神经网络来进行简单的XOR演示。可以看出,两层过后,第三层(输出层)的结果已经可以将之前无法进行线性切分的点进行区分。
其实,两层神经元实际上效果已经远远好于一层的结果。接下来如果继续增加层数,每增加一层,模型的复杂度会极大的得到增强。所以,多层神经网络能够有效的处理非常复杂的问题。
所以,对比上面单层的模型,下面两层和三层的 function模拟图形如下。所以直观的来看,多层的模型比一层的要复杂的多。
多层神经网络
多层神经网络中,两端是输入和输出层,中间是隐藏层。输入层不计算层数,比如第一层,指的是隐藏层的第一层,输入样本
符号表示方式
**函数
系数
综和上面所有符号:
下面是公式的矩阵表示形式,相比之前有了极大的简化。
**函数 Activation Function
下面是最常用的三个**函数。三个都是非线性的。
非线性
为什么要用非线性的**函数?
每个隐藏层都用线性函数当做**函数的话,那么模型永远都是线性的,无法去做非线性的操作,那么模型的能力永远也不会有较大的提升。
换种说法,理论上讲是可以用一个更复杂的线性函数,来表示多个线性的函数的。我可以用一个更复杂的线性函数来表示之前的多层线性函数,那么多层变的没有意义。
如果**函数是非线性的,那么模型效果才可以不断地通过非线性转换来提高,多层神经网络才变得有意义。
损失函数
从上面公式来看,模型的公式已经确定,模型之间的区别就是参数
既然最终目的是确定最好模型的每个参数,那么首先要确认什么是最好的模型,其次再去找最好模型的参数。那么什么是最好的模型呢?
就是损失函数最小的模型。所以对应的参数就可以写成:
优化
梯度下降 Gradient Descent(GD)
有了损失函数
暴力枚举显然是不切实际的,我们一般采用偏导数为0 的方法找到最小值。
根据下图中的公式,当
求出
这种方法就是梯度下降法。
将上述方法应用到神经网络中,得到下面的过程。
具体每一个偏微分的推导公式如下:
随机梯度下降 Stochastic Gradient Descent (SGD)
梯度下降(GD),所有的样本全部计算一次后进行迭代,这样使得效率很低,速度很慢。介绍另外一个极端 随机梯度下降(SGD) 。SGD每次只迭代一个样本,这样虽然迭代速度变快,但是会变的很不稳定。迭代大量样本之后,总体趋势向着梯度的反方向进行,但是每一次迭代方向很不稳定。
Mini-Batch
接下来介绍的就是Mini-Batch方法,可选择一次使用B个样本的迭代。很明显这种方法介于GD与SGD之间的方法。
GD vs SGD vs Mini-Batch
总结公式:
下面这个图片是三个梯度下降方法的对比,蓝色线是准确率,红色为计算时间。
课上老师没有讲准确度的问题,重点讲了一下计算时间的原因。如下图,可以发现,Mini-Batch计算时间是相对较短的。如果选择合适的Batch,可以极大地缩短计算时间。
原因是相同计算能力的计算机,在矩阵计算方面远大于循环计算。GD虽然是矩阵计算,但样本全部迭代耗时较久;SGD虽然迭代快,但却抛弃了矩阵计算,只能用循环计算。而Mini-Batch既能快速迭代,又能部分使用矩阵,增加计算速度。
最后提到了,一个神经网络中比较严重的问题。就是很多情况下,我们往往只能找到局部最小值而无法找到全局最小值。而且目前没有非常好的方法去解决。
实用技巧
初始化对结果的影响
不同的初始化结果,最后优化完成的公式可能不同。不同的初始化位置,下降的方向会有不同,从而进入不同的局部最小值中。
学习率的选择
过大则可能找不到最优点,过小则速度非常慢。所以确定一个合适的学习率大小比较重要。
Mini-Batch Tips
- 每次迭代时,重置Batch的样本,让每次学习到的样本都不一样;
- 使用同样大小的Batch size,有利于提高计算速度;
- 与学习率综合考虑进行调整。
Learning Recipe
过拟合
过拟合的解决方法:
1. 获取更多训练数据;
2. Dropout 等。