参考链接https://www.icourse163.org/learn/PKU-1002536002?tid=1002700003#/learn/content?type=detail&id=1004033052&sm=1
神经元模型:用数学公式表示为:(∑ + ),f 为激活函数。神经网络是以神经元为基本单 元构成的。
激活函数:引入非线性激活因素,提高模型的表达力。
神经网络的复杂度:可用神经网络的层数和神经网络中待优化参数个数表示
神经网路的层数:一般不计入输入层,层数 = n 个隐藏层 + 1 个输出层
神经网路待优化的参数:神经网络中所有参数 w 的个数 + 所有参数 b 的个数
损失函数(loss): 用来表示预测值(y)与已知答案(y_)的差距。在训练神经网络时,通过不断改变神经网络中所有参数,使损失函数不断减小,从而训练出更高准确率的神经网络模型。
常用的损失函数有均方误差、自定义和交叉熵等
均方误差 mse:n 个样本的预测值 y 与已知答案 y_之差的平方和,再求平均值。 在 Tensorflow 中用 loss_mse = tf.reduce_mean(tf.square(y_ - y))
例子:
#coding:utf-8
#导入模块,生成数据集
#import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
BATCH_SIZE = 8
SEED = 23455
rdm = np.random.RandomState(SEED)
X = rdm.rand(32, 2)
Y_ = [[x1 + x2 + (rdm.rand() / 10.0 - 0.05)] for (x1, x2) in X]
#定义神经网络
#定义神经网络输入、参数、输出,定义前向传播过程
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))
w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))
y = tf.matmul(x, w1)
#定义损失函数MSE
#反向传播梯度下降
loss_mes = tf.reduce_mean(tf.square(y_ - y))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mes)
#生成会话,训练
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
STEPS = 20000
for i in range(STEPS):
start = (i * BATCH_SIZE) % 32
end = (i * BATCH_SIZE) % 32 + BATCH_SIZE
sess.run(train_step, feed_dict={x: X[start: end], y_: Y_[start: end]})
if i % 500 == 0:
print("After %d training steps, w1 is: " % i)
print(sess.run(w1), "\n")
print("Final w1 is: \n", sess.run(w1))
自定义损失函数:根据问题的实际情况,定制合理的损失函数。
对于预测酸奶日销量问题,如果预测销量大于实际销量则会损失成本;如果预测销量小于实际销量则
会损失利润。在实际生活中,往往制造一盒酸奶的成本和销售一盒酸奶的利润是不等价的。因此,需
要使用符合该问题的自定义损失函数。
#定义损失函数MSE
#反向传播梯度下降
#loss_mes = tf.reduce_mean(tf.square(y_ - y))
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * COST, (y_ - y) * PROFIT))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
交叉熵(Cross Entropy):表示两个概率分布之间的距离。交叉熵越大,两个概率分布距离越远,两
个概率分布越相异;交叉熵越小,两个概率分布距离越近,两个概率分布越相似。
交叉熵计算公式:(_ , ) = −∑_ ∗
用 Tensorflow 函数表示为
ce= -tf.reduce_mean(y_* tf.log(tf.clip_by_value(y, 1e-12, 1.0)))
softmax 函数:将 n 分类的 n 个输出(y1,y2…yn)变为满足以下概率分布要求的函数。
softmax 函数应用:在 n 分类中,模型会有 n 个输出,即 y1,y2…yn,其中 yi 表示第 i 种情况出现的可
能性大小。将 n 个输出经过 softmax 函数,可得到符合概率分布的分类结果。
在 Tensorflow 中,一般让模型的输出经过 sofemax 函数,以获得输出分类的概率分布,再与标准
答案对比,求出交叉熵,得到损失函数,用如下函数实现:
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
cem = tf.reduce_mean(ce)
学习率 learning_rate:表示了每次参数更新的幅度大小。学习率过大,会导致待优化的参数在最 小值附近波动,不收敛;学习率过小,会导致待优化的参数收敛缓慢。
在训练过程中,参数的更新向着损失函数梯度下降的方向。
参数的更新公式为: + = − _
指数衰减学习率:学习率随着训练轮数变化而动态更新
滑动平均:记录了一段时间内模型中所有参数 w 和 b 各自的平均值。利用滑动平均值可以增强模
型的泛化能力。
滑动平均值(影子)计算公式:
影子 = 衰减率 * 影子 +(1 - 衰减率)* 参数
过拟合:神经网络模型在训练数据集上的准确率较高,在新的数据进行预测或分类时准确率较低,说明模型的泛化能力差。
正则化:在损失函数中给每个参数 w 加上权重,引入模型复杂度指标,从而抑制模型噪声,减小过拟合。
使用正则化后,损失函数 loss 变为两项之和: loss = loss(y 与 y_) + REGULARIZER*loss(w) 其中,第一项是预测结果与标准答案之间的差距,如之前讲过的交叉熵、均方误差等;第二项是正则化计算结果。
正则化计算方法:
① L1 正则化: = ∑||
用 Tesnsorflow 函数表示:loss(w) = tf.contrib.layers.l1_regularizer(REGULARIZER)(w)
② L2 正则化: = ∑||
用 Tesnsorflow 函数表示:loss(w) = tf.contrib.layers.l2_regularizer(REGULARIZER)(w)
#用 Tesnsorflow 函数实现正则化:
tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w)
loss = cem + tf.add_n(tf.get_collection('losses'))
前向传播:由输入到输出,搭建完整的网络结构
向传播的过程需要定义三个函数:
#第一个函数 forward()完成网络结构的设计,从输入到输出搭建完整的网络结构,实现前向传播过程。
该函数中,参数 x 为输入,regularizer 为正则化权重,返回值为预测或分类结果 y。
def forward(x, regularizer):
w=
b=
y=
return y
#第二个函数 get_weight()对参数 w 设定。该函数中,参数 shape 表示参数 w 的形状,regularizer
表示正则化权重,返回值为参数 w。其中,tf.variable()给 w 赋初值,tf.add_to_collection()表
示将参数 w 正则化损失加到总损失 losses 中。
def get_weight(shape, regularizer):
w = tf.Variable( )
tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))
return w
#第三个函数 get_bias()对参数 b 进行设定。该函数中,参数 shape 表示参数 b 的形状,返回值为参数
b。其中,tf.variable()表示给 b 赋初值。
def get_bias(shape):
b = tf.Variable( )
return b
反向传播:训练网络,优化网络参数,提高模型准确性
#函数 backward()中,placeholder()实现对数据集 x 和标准答案 y_占位,forward.forward()实现前向
传播的网络结构,参数 global_step 表示训练轮数,设置为不可训练型参数。
def backward( ):
x = tf.placeholder( )
y_ = tf.placeholder( )
y = forward.forward(x, REGULARIZER)
global_step = tf.Variable(0, trainable=False)
loss =
在训练网络模型时,常将正则化、指数衰减学习率和滑动平均这三个方法作为模型优化方法。
在 Tensorflow 中,正则化表示为:
首先,计算预测结果与标准答案的损失值
①MSE: y 与 y_的差距(loss_mse) = tf.reduce_mean(tf.square(y-y_))
②交叉熵:ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
y 与 y_的差距(cem) = tf.reduce_mean(ce)
③自定义:y 与 y_的差距
其次,总损失值为预测结果与标准答案的损失值加上正则化项
loss = y 与 y_的差距 + tf.add_n(tf.get_collection('losses'))
在 Tensorflow 中,指数衰减学习率表示为
在 Tensorflow 中,滑动平均表示为
用 with 结构初始化所有参数