赞
踩
本章说明如何将数据函数表示为一系列连接在一起构成计算图的运算,并演示如何利用这种表示方法和微积分的链式法则,来计算函数的输出相对于其输入的导数
d f d x ( a ) = lim Δ → 0 f ( a + Δ ) − f ( a − Δ ) 2 ∗ Δ \frac{df}{dx}(a) = \lim_{\Delta \to 0} \frac{{f \left( {a + \Delta } \right) - f\left( a - \Delta \right)}}{2 * \Delta } dxdf(a)=Δ→0lim2∗Δf(a+Δ)−f(a−Δ)
f
2
(
f
1
(
x
)
)
=
y
f_2(f_1(x)) = y
f2(f1(x))=y
f
1
(
x
)
=
u
f_1(x) = u
f1(x)=u
d
f
2
d
x
(
x
)
=
d
f
2
d
u
(
f
1
(
x
)
)
∗
d
f
1
d
x
(
x
)
\frac{df_2}{dx}(x) = \frac{df_2}{du}(f_1(x)) * \frac{df_1}{dx}(x)
dxdf2(x)=dudf2(f1(x))∗dxdf1(x)
f
(
x
,
y
)
=
s
f(x, y) = s
f(x,y)=s
a
=
a
(
x
,
y
)
=
x
+
y
a = a(x, y) = x + y
a=a(x,y)=x+y
s
=
σ
(
a
)
s = \sigma(a)
s=σ(a)
∂
f
∂
x
=
∂
σ
∂
u
(
a
(
x
,
y
)
)
∗
∂
a
∂
x
(
(
x
,
y
)
)
=
∂
σ
∂
u
(
x
+
y
)
∗
∂
a
∂
x
(
(
x
,
y
)
)
\frac{\partial f}{\partial x} = \frac{\partial \sigma}{\partial u}(a(x, y)) * \frac{\partial a}{\partial x}((x, y)) \ = \frac{\partial \sigma}{\partial u}(x + y) * \frac{\partial a}{\partial x}((x, y))
∂x∂f=∂u∂σ(a(x,y))∗∂x∂a((x,y)) =∂u∂σ(x+y)∗∂x∂a((x,y))
矩阵的导数实际上就是”矩阵中每个元素的导数“
X
=
[
x
11
x
12
x
13
]
X =
W
=
[
w
11
w
21
w
31
]
W =
v
=
X
∗
W
v = X * W
v=X∗W
d v d X = W T \frac{dv}{dX} = W^T dXdv=WT
向量函数及逐元素应用的函数嵌套的函数,进行求导运算
前面最多提到了向量,此处讨论的二维矩阵的导数
如果矩阵乘法作为一种”组合运算“包含在嵌套函数中时,求导的公式形式不变
d
v
d
X
=
W
T
\frac{dv}{dX} = W^T
dXdv=WT
假设矩阵 X 是 m 行 n 列,矩阵 W 是 n 行 p 列,F = XW。那么,F 对 X 的导数是一个四阶张量,其形状为 (m, n, m, p)。
但是,在许多实际应用中,我们通常对矩阵 F 的 Frobenius 范数(或者说,矩阵 F 的所有元素的平方和的平方根)的导数更感兴趣。记 L = ||F||_F^2 = trace(F^T F) = trace((XW)^T XW) = trace(W^T X^T XW)。对于这个 L,我们有:dL/dX = d(trace(W^T X^T XW))/dX = d(trace(W^T X^T XW) + trace(W^T W X^T dX))/dX = 2XWW^T所以,如果你对矩阵 F 的 Frobenius 范数的导数感兴趣,那么导数就是 2XWW^T。
直接使用第一章中创建的构成要素来构建和训练模型,从而解决实际问题。具体来说,就是使用它们来构建线性回归模型和神经网络模型,并基于真是的数据集预测房间。通过比较得知,神经网络比起线性回归具有更好的性能。
监督学习是机器学习的子集,专门用于发现已测量的数据属性之间的关系
无监督学习(unsupervised learning) 是另一种机器学习,可以认为它是在已测量的事物可尚未测量的事物之间寻找关系
特征工程是将主观层面的(非正式的)观测结果的属性映射到特征的过程
监督学习概述:
用一个矩阵X表式数据,该矩阵有n行,每行代表一个具有k的特征的观测值。每一行的观测值将是以xi = [xi1, xi2, xi3]表示的向量, 这些观测值将相互堆叠在一起形成一个批次。例如,一下是一个大小为3的批次:
x
b
a
t
c
h
=
[
x
11
x
12
x
13
.
.
.
x
1
k
x
21
x
22
x
23
.
.
.
x
2
k
x
31
x
32
x
33
.
.
.
x
3
k
]
x_{batch} =
每一批观测值都会有相应的一批目标,其中的每个元素都有对应观测值的目标数字。可以将他们表示为一维向量:
[
y
1
y
2
y
3
]
[y_{1} y_{2} y_{3}]
[y1y2y3]
y i = β 0 + β 1 ∗ x 1 + . . . + β k ∗ x k + ϵ y_{i} = \beta_{0} + \beta_{1} * x_{1} +...+ \beta_{k} * x_{k} + \epsilon yi=β0+β1∗x1+...+βk∗xk+ϵ
从加法和乘法的层面理解线性回归运算:
“训练”一个模型意味着什么呢?概括地讲,模型接受数据,并以某种方式将其与参数(parameter)进行组合,以生成预测结果 。例如,前面展示的线性回归模型接受数据X
和参数W
,并使用矩阵乘法产生预测 P_batch
:
P
b
a
t
c
h
=
[
P
1
P
2
P
3
]
P_{batch} =
惩罚函数可以评估所做预测是否准确,以及其误差的程度,例如这里使用均方误差(mean squared error, MSE):
M
S
E
(
p
b
a
t
c
h
,
y
b
a
t
c
h
)
=
(
y
1
−
p
1
)
2
+
(
y
2
−
p
2
)
2
+
(
y
3
−
p
3
)
2
3
MSE_{(p_{batch}, y_{batch})} = \frac{(y_{1} - p_{1})^2 + (y_{2} - p_{2})^2 + (y_{3} - p_{3})^2 }{3}
MSE(pbatch,ybatch)=3(y1−p1)2+(y2−p2)2+(y3−p3)2
将以上损失函数记为L(Loss)
后向传递线性回归计算图:
我们只需向后退,计算每个组成函数的导数,算出函数在前向传递中输入处的导数,最后将这些导数相乘。
训练既是重复以下步骤:
解决方案就是将样本分为训练集(training set)和测试集(testing set)。使用训练集训练模型(迭代更新权重),然后在测试集上评估模型 的性能。
这里的逻辑在于,如果模型能够成功地从训练集泛化到样本的其余部分 (整个数据集),那么相同的“模型结构”将很可能从样本(整个数据 集)泛化到总体,这也是最终目标。
以下将把线性回归模型扩充到非线性模,核心思想就是,首先执行一系列线性回归,然后将结果输入到一个非线性函数,最终执行最后一个线性回归并做出预测。
什么是一系列线性回归? 也就是将W的维度由 [num_features, 1] 扩展到 [num_features, num_outputs]。 这样,对于每个观测值,都有原始特征的num_outputs个加权和。
可以将这些加权和视为”已学习到的特征“, 即原始特征的组合。
接下来把每个加权和输入到一个非线性函数中。我们要尝试的第一个函数是sigmod函数。
sigmod函数具有以下特点:
最后将得到num_features个元素,其中每个元素都是原始特征的组合,当把他们输入到sigmod函数后,取值都在0和1之间。同时,将这些元素输入到 一个常规的线性回归模型中,使用它们的方式与之前使用原始特征的方式 相同。
较为常见的神经网络表示法:
第一列13个圆圈表示13个原始特征。
第二列13个圆圈表示已学习到的13个特征。(第二列有13个原因是W的维度为[num_features, num_outputs], num_outputs取值为num_features, 也就是13)
最后一个圆代表最终预测结果。(由于每一个圆都用于最终结果预测,所以13个圆都要链接到最后一个圆圈)
在神经网络中,后向传递的原理与在简单的线性回归模型中的原理相同, 只不过步骤相对多一点。
主要涉及两个步骤:
基于基本原理,构建深度学习模型更高层次的组件,即layer类、optimizer类等
可以分为两类,一类是进行矩阵运算,例如矩阵乘法,另一类是进行将某个操作作用于所有矩阵元素,例如sigmod
限制:
1. 输出梯度的形状必须与输出的形状相匹配
2. 后向传递期间向后发送的输入梯度,其形状必须与输入的形状相匹配
就operation类而言,层是一系列线性运算外加后边跟着的一个非线性运算。
需要实现的operation: 权重乘法, 偏差项加法,sigmod
class WeightMultipy(ParamOperation):
'''
神经网络的权重乘法运算
'''
class BiasAdd(ParamOperation):
'''
增加偏差项
'''
class Sigmod(ParamOperation):
'''
sigmod激活函数
'''
需要实现的layer: 全连接层或者称为稠密层
class Dense(layer):
'''
全连接层
'''
NeuralNetWorkt需要具备的功能:
class Loss(object):
'''
神经网络的损失
'''
class MeanSquaredError(Loss):
'''
均方误差
'''
class NerralNeetwork(object):
'''
神经网络对应的类
'''
class Optimizer(object):
'''
神经网络优化基类
'''
class SGD(Optiomizer):
'''
随机梯度下降优化器
'''
需要具备的功能:
class Trainer(object):
'''
训练神经网络
'''
deep_neural_network = NeuralNetwork( layers=[Dense(neurons=13, activation=Sigmoid()), Dense(neurons=13, activation=Sigmoid()), Dense(neurons=1, activation=LinearAct())], loss=MeanSquaredError(), learning_rate=0.01 ) optimizer = SGD(lr=0.01) trainer = Trainer(deep_neural_network, optimizer) trainer.fit(X_train, y_train, X_test, y_test, epochs = 50, eval_every = 10, seed=20190501)
优化神经网络的一些关键技术
引入的原因是, 对于输入到神经网络的所有观测值,不仅每个值都应该位于0到1之间,而且概率向量之和应为1
每个时间步长的参数更新将是过去时间步长参数更新的加权平均值,其中权重呈指数衰减
u p d a t e = ∇ t + μ × ∇ t − 1 + μ 2 × ∇ t − 2 + . . . update=\nabla_{t}+\mu \times \nabla_{t-1} + {\mu}^2 \times \nabla_{t-2} + ... update=∇t+μ×∇t−1+μ2×∇t−2+...
随着训练的进行,越来越需要降低学习率。
简单地在一层中随机选择一定比例的神经元p,并在每次前向传递训练中将他们设置为0。他可以改变神经网络的容量,并降低发生过拟合的可能性
卷积神经网络,专门用于理解图像的神经网络
先介绍了前几章所构架的神经网络并不能处理的网络情形,从而引出了自动微分架构。循环神经网络,专门用于理解数据点按顺序出现的数据,例如时间序列数据或自然语言数据。还介绍了RNN的两种变体GRU和LSTM的工作原理。
如何使用高性能的开源神经网络PyTorch
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。