神经网络概述
神经网络分为:一个输入层,一个或多个隐藏层,一个输出层
隐藏层中,训练集的值是无法直接看到的。
计算神经网络的层数时不算入输入层,将输入层称为第0层。
下图是一个双层神经网络:
a的上标[]表示层数,下标表示第几个神经元。
神经网络输出
一个隐藏层的神经元中要计算两步:
多样本向量化
a^[m](i)中
[m]表示第m层
(i)表示第i个训练实例
因为每个神经元都要计算z和a,所有可以将他们向量化,不用循环计算多次:
激活函数
激活函数为模型引入非线性变换,从而让神经网络能够学习和拟合复杂的非线性关系。没有激活函数的神经网络,本质上只是多层线性回归模型,无法处理现实世界中诸如图像、语言、声音等具有复杂非线性特征的数据。
输出 = 激活函数(权重×输入 + 偏置)
上面例子中的sigmoid函数(0,1)就是一个激活函数.
激活函数可以将神经元的输出值映射到特定范围(如 0~1 或 - 1~1),避免数值过大导致的梯度爆炸或模型不稳定
tanh函数((-1,1)sigmoid函数的位移版)效果更好,用在二分类的输出层sigmoid更好。
不同层的激活函数可以不同。
目前隐藏层的激活函数普遍用ReLU函数
激活函数 | 特点 | 适用场景 |
---|---|---|
Sigmoid | 输出范围 (0,1),可表示概率;但存在梯度消失问题(输入过大 / 过小时梯度接近 0)。 | 二分类问题的输出层 |
Tanh | 输出范围 (-1,1),中心对称;仍有梯度消失问题。 | 早期隐藏层(现已较少用) |
ReLU | 计算简单,缓解梯度消失;但存在 “死亡 ReLU” 问题(输入为负时神经元永久失效)。 | 卷积神经网络(CNN)隐藏层 |
Leaky ReLU | 解决死亡 ReLU 问题,保留 ReLU 的高效性。 | 深度学习通用隐藏层 |
Softmax | 输出多分类概率分布(和为 1)。 | 多分类问题的输出层 |
为什么要有非线性激活函数:如果一直用线性激活函数,有隐藏层和没有任何隐藏层是一样的,即没有激活函数的神经网络无法学习非线性关系。
随机初始化
逻辑回归中可以初始化为0,但是其他的不一定能这样。
如果w全初始化为0,则输入相同的东西计算得到的输出总是相同的,各个神经元在计算同样的东西。
可以令w = np.random.randn((2,2))*0.01 #输入两个特征,则w为2×2的矩阵,乘0.01因为如果w是一个很大的数,则通过激活函数计算后输出结果落在一个坡度很平缓的地方,梯度下降较慢,减慢学习速度,所以一开始×0.01需要一个比较小的数(初始化参数一般较小)。
b可以设置为0,即b = np.zero((2,1))