4.1 网络的前馈方式–深度前馈神经网络(Deep FeedForward Neural Network)
前馈神经网络中具有代表行的样例是多层感知机(Multilayers Perception,MLP)
4.2 全连接
(1)神经元与全连接结构
(2)前向传播算法
###MPL--linear
import tensorflow as tf
x=tf.constant([0.9,0.85],shape=[1,2])
w1=tf.Variable(tf.random.normal([2,3],stddev=1,seed=1),name="w1")
w2=tf.Variable(tf.random.normal([3,1],stddev=1,seed=1),name="w2")
b1=tf.Variable(tf.zeros([1,3]))
b2=tf.Variable(tf.ones([1]))
@tf.function
def multi_matmul(x,w_1,w_2,b_1,b_2):
a=tf.matmul(x,w_1)+b_1
y=tf.matmul(x,w_2)+b_2
return y
print(multi_matmul(x=x,w_1=w1,w_2=w2,b_1=b1,b_2=b2))
4.3 线性模型的局限性
多层线性模型可以用一个线性计算表示。
4.4 激活函数
1.将神经元的输出通过一个非线性函数-“激活函数(active function)”。
常用的激活函数
- ReLu激活函数
ф(z)=max{0,z}
加入Relu激活函数的神经元被称为整流线性单元。
当整流线性单元处于激活状态时(输出不为0),它的一阶导数能够保持一个较大值(=1),二阶导数几乎处处为0。在研究一阶导数和二阶导数对优化参数的取值有很大的帮助。 - sigmoid激活函数
ф(z)=σ(z)=1/(1+exp(-z)) - tanh双曲正切激活函数
ф(z)=tanh(x)=(1-exp(-2z))/(1+exp(-2z))
其中:
1-2σ(z)=-tanh(z/2)
sigmod函数不被鼓励应用于前馈网络中的隐藏单元,因为基于梯度下降优化算法会由于sigmod函数饱和性的存在而变得非常困难,需要找到一个合适的损失函数来抵消它的饱和性。
当前TensorFlow中提供了7中不同的非线性激活函数:
nn.relu()/nn.relu6()/nn.softplus()/nn.droupt()/nn.bias_add()/sigmoid()/tanh()
2.激活函数实现去线性化
a=tf.nn.relu(tf.matmul(x,w1)+b1)
b=tf.nn.relu(tf.matmul(x,w2)+b2)
4.5 多层网络解决异或运算
1.多层变换:M-P神经元模型
4.6 损失函数
经典损失函数-交叉熵损失函数、均方差损失函数
1.信息论与交叉熵损失函数
- 一个极有可能发生的事件信息量会比较少,并且在极端情况下,确保能发生的事件应该没有信息量。
- 越小概率发生的事情具有越高的信息量。
- 重复发生的独立时间应具有增量信息。
时间X=x的自信息:I(x)=-log(P(x)),单位为nat
1nat是以1/e的概率观测到一个事件时获得的信息量。
自信息会输出单个时间的信息量值,可以使用香农熵(shannon entropy)来对整个事件概率分布中的不确定性总量进行量化。
离散型随机变量X的分布率为:P{X=xk}=pk,k=1,2,…
级数Σ(xkpk)绝对收敛,称其为变量X的数学期望,则 E(x)=Σxkpk – 均值
连续变量 E(x)=ʃxf(x)dx
拓展到求解随机变量函数的数学期望
Y=g(x)
若级数Σ(g(xk)pk)绝对收敛,则
E(Y)=E[g(x)]=Σg(xp)pk;
E(Y)=E[g(X)]=ʃg(x)f(x)dx
则香农熵的计算公式为:
H(X)=Exp[I(x)]=-Exp[log(P(x))] 记做H§。
一个分布的香农熵是指遵循这个分布的事件所产生的期望信息总量。
如果对X的同一个随机变量有两个单独的概率分布p(x)和Q(x),可以使用KL散度衡量这两个分布的差异:
Dkl(P||Q)=Ex-p[log(p(x)/Q(x))]=Ex-p[log(P(x))-log(Q(x))]
KL散度是非负的。Dkl=0表示在X离散时P和Q的取值处处相同。
注意:Dkl(P||Q)!=Dkl(Q||P);
交叉熵:
H(P,Q)=H§+Dkl(P||Q)
H(P,Q)=-Ex-plog(Q(x))=-ΣP(x)logQ(x)
a=tf.constant([[1.0,2.0,3.0,4.0],
[5.0,6.0,7.0,8.0]])
print(tf.clip_by_value(a,2.5,6.5))
print(tf.log(a))
print(tf.reduce_mean(a))
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
nn.softmax_cross_entropy_with_logits()
sigmod函数与softmax回归
概率分布一般用于刻画不同时间发生的概率。时间总数有限的情况下:概率分布函数P(X=xk)满足:
Ɐx P(X=xk)∊[0,1] 且 ∑P(X=xk)=1
softmax(y)i=yi’=eyi/(Σeyj)=exp(yi’)/(Σexp(yj)
softmax回归之后的交叉熵损失函数:
cross_rntropy=tf.nn.softmax_cross_entropy_with_logits(y,y_)
二分类问题中:
答案的取值类型可以看做满足Bernoulli分布。Bernoulli分布仅需要单个参数来定义。
神经网络仅需要预测P(y=1|x)即可。
分布规律为:
P(X=x1)=p;
P(X=x2)=1-p;
两点分布的分布规律:
P(X=x)=px(1-p)1-x
Ex[x]=p
注意:
输入值接近0或者1时,函数的梯度非常小,基于梯度优化会变得很困难,所以一般在通过Sigmoid函数得到概率值之后还要对这个概率值求解似然函数,通过最大似然的方式训练sigmoid分类器。
2.均方误差损失函数
MES(y,y’)=(Σ(yi-yi’)2)/n;
最小二乘法基本思想:
对一组观察到的值,计算误差平方和ԑi=yi-(a+bx)
Q(a,b)= Σ(ԑi)2=Σ(yi-(a+bx))2最小化Q(a,b)过程中得到的a,b被称为最小二乘估计。
求导
3.自定义损失函数
loss=tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*a,(y-y_)*b))