相关练习项目:一个简单的神经网络
感知器 (perceptron)
即信号输入元, 单个的数据源, 比如人的眼睛,耳朵,鼻子,都是感知器
离散型和连续型预测 (discrete & continuous)
激活函数 (activation function)

使用连续激活函数,预测的结果不是非对即错,而是一个概率,表示预测结果的可靠,及确定性

SoftMax
多类别分类时使用 SoftMax

定义
def softmax(L):
expL = np.exp(L)
return expL/expL.sum()
分类问题的预测结果使用softmax作为激活函数,转化之后的结果加总为 100%,每个值代表一个预测结果可能发生的概率
One-hot Encoding

[2,4,56,7,8,...]
,需要转换成类似
[[0,1,0,0,0,0,0],
[0,0,0,1,0,0,0],
[0,0,1,0,0,0,0],
[0,0,0,0,1,0,0],
...]
这样的数据,计算机才能高效的处理.
(不过使用PyTorch做分类问题时,不需要手动转化)
最大似然率(maximum likelihood)

交叉墒(cross entropy)
概率和误差函数之间有一定的联系,这种联系叫做交叉墒

把每个预测概率转化成 对数(-log)并相加,可以很方便的求均值,因此这个误差函数不管数据量的大与小,都有比较好的参考价值

多类别交叉墒(Multi-Class Cross-Entropy)

误差函数(Error function, criterion)

👈左边为二元分类问题的误差函数,👉右边为多元分类问题的误差函数, 其他误差函数还有均方差(MSE),L1,kl,详见here
神经网络架构
对现实世界的复杂问题,一般不能用二分法进行分类预测,根据实际问题数据集分布情况,采用不同层级的网络结构才能得到比较好的预测结果.






多类别分类

前向反馈 (feedforward)
前向反馈是神经网络用来将输入变成输出的过程.

反向传播 (backpropagation function)
神经网络模型训练过程
- 进行前向反馈运算.
- 将模型的输出与期望的输出进行比较.
- 计算误差.
- 向后运行前向反馈运算(反向传播),将误差分散到每个权重上->梯度下降
- 更新权重,并获得更好的模型.
- 继续此流程,直到获得好的模型.
链式法则(Chain Rule)



实现梯度下降
画了一个拥有两个输入的神经网络误差示例,相应的,它有两个权重。你可以将其看成一个地形图,同一条线代表相同的误差,较深的线对应较大的误差。 每一步,你计算误差和梯度,然后用它们来决定如何改变权重。重复这个过程直到你最终找到接近误差函数最小值的权重,即中间的黑点。

注意事项
因为权重会走向梯度带它去的位置,它们有可能停留在误差小,但不是最小的地方。这个点被称作局部最低点。如果权重初始值有错,梯度下降可能会使得权重陷入局部最优,例如下图所示。

梯度下降:数学


每次按一定比率η(学习率)更新权重


定义一个误差项(Error term)


多个输出的时候,权重更新项wij如上图
梯度下降数学推导

以sigmoid激活函数为例
sigmoid 型函数的导数





梯度下降算法

梯度下降:

# Defining the sigmoid function for activations
# 定义 sigmoid 激活函数
def sigmoid(x):
return 1/(1+np.exp(-x))
# Derivative of the sigmoid function
# 激活函数的导数
def sigmoid_prime(x):
return sigmoid(x) * (1 - sigmoid(x))
# Input data
# 输入数据
x = np.array([0.1, 0.3])
# Target
# 目标
y = 0.2
# Input to output weights
# 输入到输出的权重
weights = np.array([-0.8, 0.5])
# The learning rate, eta in the weight step equation
# 权重更新的学习率
learnrate = 0.5
# the linear combination performed by the node (h in f(h) and f'(h))
# 输入和权重的线性组合
h = x[0]*weights[0] + x[1]*weights[1]
# or h = np.dot(x, weights)
# The neural network output (y-hat)
# 神经网络输出
nn_output = sigmoid(h)
# output error (y - y-hat)
# 输出误差
error = y - nn_output
# output gradient (f'(h))
# 输出梯度
output_grad = sigmoid_prime(h)
# error term (lowercase delta)
error_term = error * output_grad
# Gradient descent step
# 梯度下降一步
del_w = [ learnrate * error_term * x[0],
learnrate * error_term * x[1]]
# or del_w = learnrate * error_term * x
梯度下降算法



考虑一个简单神经网络,它只有一个隐藏层和一个输出节点.这是通过反向传播更新权重的算法概述:

过拟合和欠拟合(overfitting & underfitting)


早期停止 Early stopping

避免过拟合的方法
1.正则化(regularization)





2.Dropout
训练过程中,随机的关闭一定比例的节点,为了其他节点得到更多的训练

局部最低点

对策:1.随机重新开始

2.动量 Momentum


梯度消失

其他激活函数


批次和随机梯度下降 batch&stochastic gradient descent

学习速率衰退

来源:https://www.cnblogs.com/liuzhongrong/p/12346631.html