深度学习基础及数学原理学习笔记
- 常见机器学习方法
- 线性回归
- 损失函数
- 梯度下降
- 梯度
- Mini-batch的梯度下降法
- 方差、偏差
常见机器学习方法
- 监督学习
已有训练样本,去训练得到一个最优模型,再利用这个模型将所有的输入映射为相应的输出。 - 无监督学习
事先没有任何训练样本。需要直接对数据进行建模。 - 半监督学习
有大量未标记的数据和少量标记的数据。 - 强化学习
设定一个回报函数,通过这个函数来确认是否越来越接近目标。
线性回归
线性回归来确定两种或两种以上变量间相互依赖的定量关系。线性回归对于输入x和输出y有一个映射(类似ax+b),而我们是训练a、b这两个参数。
以下代码使用PyTorch建立一个线性的模型来对其进行拟合,即训练过程。
def linear_ex():
x = np.random.rand(256)
noise = np.random.randn(256) / 4
y = 5 * x + 7 + noise
# 以下使用PyTorch建立一个线性的模型来对其进行拟合,即训练
# (1,1)代表输入输出的特征数量是1,y=w*x+b,其中w代表权重,b代表偏置
model = Linear(1, 1)
# 损失函数
criterion = MSELoss()
# 优化器
optim = SGD(model.parameters(), lr=0.01)
# 训练次数
epochs = 3000
# x_train, y_train 的形状是 (256, 1), 代表 mini-batch 大小为256, feature 为1。astype('float32') 是为了下一步可以直接转换为 torch.float。
x_train = x.reshape(-1, 1).astype('float32')
y_train = y.reshape(-1, 1).astype('float32')
# 开始训练
for i in range(epochs):
# 整理输入、输出数据。转成torch的Tensor类型
inputs = torch.from_numpy(x_train)
labels = torch.from_numpy(y_train)
# 使用模型预测
outputs = model(inputs)
# 梯度归零,以免累加
optim.zero_grad()
# 损失
loss = criterion(outputs, labels)
# 反向传播
loss.backward()
# 优化。相当于更新
optim.step()
if i % 100 == 0:
print('epoch {},loss {:1.4f}'.format(i, loss.data.item()))
# 训练结束,提取最后的模型参数。
[w, b] = model.parameters()
print(w.item(), b.item())
# 可视化模型,查看训练数据
predicted = model.forward(torch.from_numpy(x_train)).data.numpy()
plt.plot(x_train, y_train, 'go', label='data', alpha=0.3)
plt.plot(x_train, predicted, label='predicted', alpha=1)
plt.legend()
plt.show()
损失函数
pytorch内置损失函数:
- nn.L1Loss:输入x和目标y之间差的绝对值。(要求维度一致)
- nn.NLLLoss:用于多分类的负对数似然损失函数。
- nn.MSELoss:输入x和目标y之间均方差。
- nn.CrossEntropyLoss:多分类用的交叉熵损失函数。(一般多分类的情况会使用这个损失函数)
- nn.BCELoss:计算 x 与 y 之间的二进制交叉熵。
梯度下降
梯度下降是一个使损失函数越来越小的优化算法。在约束优化问题时(无求解机器学习算法的模型参数),梯度下降是最常用的方法之一。
梯度
- 微积分中,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来。就是梯度
- 几何中,梯度是函数变化增加最快的地方。沿着梯度向量的方向,易找到最大值,反之,易找到最小值
梯度下降法:求解当前位置的梯度,然后沿着梯度的负方向,走下一步。
Mini-batch的梯度下降法
每一步梯度下降法需要对整个训练集进行一次处理,但是如果数据集很大,处理速度很慢,并且不能一次性加载到内存或显存。因此,将数据集划分为小数据集,这种小数据集成为Mini-batch。这种梯度下降法,一个epoch可以进行Mini-batch的个数次梯度下降。
Mini-batch size的计算规则如下,在内存允许的最大情况下使用2的N次方个size
随机梯度下降算法。
# lr参数为学习率,对于SGD来说一般选择0.1 0.01 0.001。
# 如果设置了momentum,就是带有动量的SGD,可以不设置
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
RMSprop是一种可以加快梯度下降的算法,利用此算法,可减小某些维度梯度更新波动较大的情况,使其梯度下降的速度更快。
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.09)
Adam 优化算法的基本思想就是将 Momentum 和 RMSprop 结合起来形成的一种适用于不同深度学习结构的优化算法。
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, betas=(0.9, 0.999), eps=1e-08)
方差、偏差
- 偏差:度量了学习算法的期望预测与真实结果的偏离程序。拟合能力
- 方差:度量了同样大小的训练集的变动,导致学习性能的变化。泛化能力
高偏差即欠拟合,拟合度不够,通过增加网络结构、增加训练时间、寻找合适的网络架构解决;高方差即过拟合,失去泛化能力,通过使用更多数据、正则化、寻找合适的网络结构解决。
# 计算偏差
print(5 - w.data.item(), 7 - b.data.item())
正则化:
- L1正则化
损失函数的基础上,加上权重参数的绝对值。 - L2正则化
损失函数的基础上,加上权重参数的平方和。