【多分类问题和Sigmoid的替代品】吴恩达机器学习笔记EP7(P61-P70)
从今天开始我将学习吴恩达教授的机器学习视频,下面是课程的连接1.1 欢迎来到机器学习!_哔哩哔哩_bilibili。一共有142个视频,争取都学习完成吧。
Sigmoid的替代品
之前介绍过多种激活函数,将多种激活函数自由组合,便能建立功能更强大的神经网络。
这里再介绍一个新的激活函数——ReLU。
ReLU函数的功能基本就是当输入z小于0时,输出0;当z大于等于0时输出z本身。
选择激活函数
输出层中激活函数的选择可以根据实际不同的问题用不同的函数。
比如分类问题中我们一般选择Sigmoid函数。
回归问题当中我们一般选择Linear activation function或者ReLU函数。
梯度下降的时候,g(z)平坦时,梯度下降慢。
Sigmoid函数有两处平坦,ReLU函数只有一处平坦。
所以相对来说,ReLU训练的时候会快一些,所以隐藏层当中一般用ReLU函数。
总的来说,隐藏层中默认使用ReLU作为激活函数。
输出层的激活函数要根据实际的问题选择。
为什么我们需要激活函数?
如果用线性函数构建神经网络,不管叠了多少层,最后的整个模型都是一个线性回归。
线性代数里面的知识:线性函数的线性函数还是线性函数。
所以不要在隐藏层中使用线性函数当激活函数(用ReLU)
多类
之前说的分类都是将数据分成两类。
多类问题做的就是分类多个类别的数据。
Softmax
Softmax就是出力多累问题的激活函数,下面是Softmax函数跟分两个类之间做法的不同和函数的定义:
Softmax的损失函数
Softmax的损失函数如下图所示:
它的损失函数是一个负对数。
对应的a越小,损失越大。
神经网络的Softmax输出
因为要分多个类,所以将输出层的神经元改为多个。
下面是多分类用TensorFlow实现代码:
里面的SparseCategoricalCrossentropy是用于多分类问题的交叉熵。
# 这里的损失函数是用于多分类问题的交叉熵
model.compile(loss=SparseCategoricalCrossentropy())
Softmax的改进实现
因为数据存储方式的影响,代码中计算数据的小数位可能会丢失或者被四舍五入。
因此减少此影响的方式是尽可能减少或减去中间变量。
model = Sequential(
[
tf.keras.Input(shape=(400,)), #specify input size
Dense(25, activation='relu'), # 第一个全连接隐藏层,25个单元,ReLU 激活
Dense(15, activation='relu'), # 第二个全连接隐藏层,15个单元,ReLU 激活
Dense(10, activation='sigmoid') # 输出层,10个单元,Sigmoid 激活
]
)
model.compile(loss=BinaryCrossEntropy(from_logits=True))
Softmax里面也是如此,不使用中间变量a,直接写其展开式。
多个输出的分类
要更多分类区分的是多类问题。
多个输出的分类,多类其本质是一个输入输出多个类别。(也就是一个输入中有多个类需要分)
多类的输出向量的每个元素就代表一个类。
高级优化算法
在梯度下降的时候,如果W或者b一直在一个方向上移动,我们就希望增大学习率α;如果W或者b一直持续震荡,我们希望减小学习率α。
因此我们需要一个可以自动调整α的算法。
Adam就是这样一个算法。
Adam算法可以通过用不同的α动态地根据情况改变α。
有关Adam算法的解释较为复杂,这里不展开,但是你可以直接在TensorFlow中调用它。
额外种类的层
除了前面提到的几种层,卷积层也是常用的一种层。
卷积层中每个神经元只看输入的一部分。
所以它的好处就是可以加快计算的速度,还有需要更少的训练数据(更不容易发生过拟合)。
如下图卷积层的每个神经元都只看前一层的一部分。