目录
1. 3 层神经网络的实现
1.1 输入层数据到 1 层神经元
1.2 1 层神经元到 2 层神经元
1.3 2 层神经元到输出层神经元
2. 输出层的激活函数
2.1 恒等函数
2.2 softmax 函数
2.2.1 softmax 函数表达式
2.2.2 softmax 代码实现
2.2.3 softmax 的改进
2.2.3 softmax 函数特征
1. 3 层神经网络的实现
下面我们看一下简单的 3 层神经网络,它由输入层、1层神经元、2层神经元、输出层神经元组成。因为神经元是 3 层,所以称之为 3 层神经网络。
前面我们已经讲了输出层数据到 1 层时候的激活函数问题,现在我们考虑三层转换:
- 输入层数据到 1 层神经元
- 1 层神经元到 2 层神经元
- 2 层神经元到输出层神经元
1.1 输入层数据到 1 层神经元
下图可以看到输入层数据到 1 层神经元的示意图
按照先前的假设,
- 输入层的数据为 X,输入层到 1 层的权重为 W1;1 层到 2 层的权重为 W2;2 层到 输出层的权重为 W3;
- 输入层的灰色 1 圆圈为输入层的 “偏置” B1,1 层神经元的灰色 1 圆圈为1层的 “偏置” B2;2 层的灰色 1 圆圈为2层的 “偏置” B3;
- 1 层收到的数据为 A1;2 层收到的数据为 A2;输出层收到的数据为 A3;
- Z1 用来表示 1 层神经网络通过激活函数转换后的信号;
那么到达 1 层神经网络的数据为
A1=np.dot(X,W1)+B1
假设1 层神经网络通过激活函数为 sigmoid 函数。
Z1=sigmoid(A1)
1.2 1 层神经元到 2 层神经元
1 层神经元到 2 层神经元,其实非常类似输入层数据到 1 层神经元。2 层收到的数据为 A2;Z2 用来表示 2 层神经网络通过激活函数转换后的信号;2 层神经元的激活函数为 sigmoid 函数。
A2=np.dot(Z1,W2)+B2
Z2=sigmoid(A2)
1.3 2 层神经元到输出层神经元
2 层神经元到 输出层神经元,区别在于它的激活函数不一样。输出层收到的数据为 A3;Z3 用来表示输出层神经网络通过激活函数转换后的信号。
A3=np.dot(Z2,W3)+B3
输出层的激活函数,可以用 来表示,其读作 sigma。 可以是恒等函数(输入和输出相等),也可以是其他函数,视具体需要。
Z3=
2. 输出层的激活函数
在神经网络中,输出层的激活函数,要根据求解问题的性质决定。一般的回归问题可以使用恒等函数,二元分类问题可以使用 sigmoid 函数,多元分类问题可以使用 softmax 函数。
机器学习的问题大致可以分为分类问题和回归问题。分类问题就是数据属于哪一个类别的问题。而回归问题是根据某个输入预测一个(连续的)数值问题。
输出层的激活函数,可以用 来表示,其读作 sigma。
2.1 恒等函数
恒等函数( identity_function )将输入按照原样输出,不加以任何改动地直接输出。
2.2 softmax 函数
下面是 softmax 函数示意图
2.2.1 softmax 函数表达式
softmax 函数表达式如下:
;分子是输入信号的指数函数,分母是所有输入信号的指数函数的和。使用softmax 函数时候,输出层的各个神经元都受到所有输出信号的影响。
2.2.2 softmax 代码实现
按照 softmax 函数表达式,利用 NumPy 模块的函数,可以实现 softmax 函数。请见如下代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def softmax(a):
exp_a=np.exp(a)
sum_exp_a=np.sum(exp_a)
y=exp_a/sum_exp_a
return(y)
a1=np.arange(0,100,1)
a2=np.arange(0,200,1)
y1=softmax(a1)
y2=softmax(a2)
plt.plot(a1,y1,label="softmax a1")
plt.plot(a2,y2,linestyle="dashdot",label="softmax a2")
plt.xlabel("a line")
plt.ylabel("y line")
plt.xlim(0,200) #指定 x 轴的位置
plt.ylim(-0,1) #指定 y 轴的位置
plt.title(" softmax a1 & softmax a2")
plt.legend()
plt.show()
为了让大家更直接的看到 softmax 的特性,我特意准备了两套数据,可以看到,在 k 越接近 n 时候, 越接近 1。y 曲线不是平稳上升的,在很大的区间范围内,它都接近于 0 ,只是在数据区间的末端,才迅猛上升,无限接近于 1。
2.2.3 softmax 的改进
如果大家写代码时候关注计算机的性能和溢出问题,就会注意到 softmax 函数中的 exp 很容易溢出计算机的有限数据宽度。也就是说,该函数能表示的数值范围是有限的。
科学家们经过改良,将 softmax 改为如下形式:
其中 C 理论上是一个任意的非 0 常数,C可以是任意值,但是为了防止溢出,一般使用输入信号中的最大值。
经过改良后的 softmax 代码实现为 softmax_improve:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def softmax(a):
exp_a=np.exp(a)
sum_exp_a=np.sum(exp_a)
y=exp_a/sum_exp_a
return(y)
def softmax_improve(a):
c=np.max(a)
exp_a=np.exp(a)
sum_exp_a=np.sum(exp_a-c)
y=exp_a/sum_exp_a
return(y)
a1=np.arange(0,100,1)
a2=np.arange(0,200,1)
y1=softmax_improve(a1)
y2=softmax_improve(a2)
plt.plot(a1,y1,label="softmax_improve a1")
plt.plot(a2,y2,linestyle="dashdot",label="softmax_improve a2")
plt.xlabel("a line")
plt.ylabel("y line")
plt.xlim(0,200) #指定 x 轴的位置
plt.ylim(-0,1) #指定 y 轴的位置
plt.title(" softmax a1 & softmax a2")
plt.legend()
plt.show()
2.2.3 softmax 函数特征
从上图我们可以看出 softmax 函数的特征:
- 输出归一化:softmax 函数的输出是 0.0 到 1.0 之间的实数,并且 函数的输出值总和是 1。正是因为这个性质,才可以把其输出解释为概率;
- 单调性:即使使用了 softmax 函数,输入信号之间的大小关系也不会改变,因为 exp 指数函数是单调递增的;一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果,而输出值最大的神经元位置不会变化,所以该神经网络进行分类时候,输出层的 softmax 函数可以省略,以减少计算机运算量。
'''
要是大家觉得写得还行,给我回复几个字吧,想给博客涨涨人气,非常感谢!
'''