为什么要用激活函数?
在实际应用中某些数据是线性可分的,即可以用一条直线将数据分开:
而有些数据则无法通过线性进行分割,
此时可以通过线性变换的方式进行分割:x² y²的方式
总而言之,激活函数可以引入非线性因素,解决线性模型所不能解决的问题。
神经网络复杂度:
一、空间复杂度:
① 层数=隐藏层数+输出层 ② 总复杂度=总W + 总b
上图的层数:隐藏层+输出层 = 2
上图的复杂度:3*4+4 + 4*2+2 = 26
二、时间复杂度
乘加运算次数
3*4 + 4*2 = 20
学习率:
① W(t+1) = W(t) - L(r)* Зloss / ЗW(t)
② 指数衰减学习率 = 初始学习率 * 学习率衰减率 ** (当前轮数 / 多少轮衰减一次)
激活函数:
激活函数的标准
1、非线性:非线性可使多层神经网络可逼近所有函数
2、可微性:大多蚕蛹梯度下降的方式更新参数
3、单调性:当激活函数单调,可以保障单层网络的损失函数是凸函数
4、近似恒等性:f(x) ≈ x,当参数初始化随机最小值,神经网络更稳定
一、sigmoid 【tf.nn.sigmoid】
函数:f(x) = 1 / (1 + e**-x)
缺点:
① 易造成梯度损失
② 输出非0均值,训练慢
③ 幂运算复杂,训练时间长
二、Tanh 【tf.math.tanh(x)】
函数:f(x) = (1-e**-2x)/(1+e**-2x)
缺点:
① 输出是 0 均值
② 易造成梯度消失
③ 幂运算复杂,训练时间长
三、Relu 【tf.nn.relu(x)】
函数: |- 0 x<0
f(x) = max(x,0) = |
|- x x>=0
优点: 缺点:
① 解决梯度消失(正区间) ① 输出非0均值,收敛慢
② 计算快(输入>0) ② Dead Relu问题
③ 收敛快于sigmoid和Tanh