渐近恒等变换,节点输入等于节点输出,不会随着深度的增加而发生显著的变化,神经网络会更加稳定,梯度更容易回传。
公式:
微分求导
Identity 激活函数的特点,符合了部分潜在行为是线性的。与非线性矛盾,但是不影响它在(回归任务)最后的输出上,使用它。
可视化:红色线为原函数, 蓝色线为导数
可视化代码实现:
import math
import matplotlib.pyplot as plt
import numpy as np
import mpl_toolkits.axisartist as axisartist
# 以类实现
class Identity:
# 原函数
def forward(self, w_input):
return w_input
# 导数
def backward(self, output):
# 在此例子中,需转换为相同的形状,其实都是返回 1
# return 1
out = np.copy(output)
out[:] = 1
return out
def Axis(fig, ax):
#将绘图区对象添加到画布中
fig.add_axes(ax)
# 隐藏坐标抽
ax.axis[:].set_visible(False)
# new_floating_axis 创建新的坐标
ax.axis["x"] = ax.new_floating_axis(0, 0)
# 给 x 轴创建箭头线,大小为1.0
ax.axis["x"].set_axisline_style("->", size = 1.0)
# 给 x 轴箭头指向方向
ax.axis["x"].set_axis_direction("top")
# 同理,创建 y 轴
ax.axis["y"] = ax.new_floating_axis(1, 0)
ax.axis["y"].set_axisline_style("->", size = 1.0)
ax.axis["y"].set_axis_direction("right")
# 返回间隔均匀的100个样本,计算间隔为[start, stop]。
x = np.linspace(-5, 5, 100)
y_forward = Identity().forward(x)
y_backward = Identity().backward(x)
#创建画布
fig = plt.figure(figsize=(12, 12))
#创建绘图对象ax
ax = axisartist.Subplot(fig, 111)
Axis(fig, ax)
# 设置x, y轴范围
plt.ylim((-5, 5))
plt.xlim((-5, 5))
# 原函数,forward function
plt.plot(x, y_forward, color='red', label='forward function')
plt.legend()
# 导数, backward function
plt.plot(x, y_backward, color='blue', label='backward function')
plt.legend()
plt.show()