了解神经网络结构和优化方法

了解基础算子

conv2D

conv2D是卷积神经网络的操作函数,即二维卷积,在pytorch中查得如下:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’, device=None, dtype=None)
其中前三个参数需要手动传入,其余参数均有默认值。

in_channels:输入的四维张量[N, C, H, W]中的C,即输入张量的channels数,这个形参是确定权重等可学习参数的shape所必需的。
out_channels:期望的四维输出张量的channels数。
kernel_size:卷积核的大小,一般我们会使用5x5、3x3这种左右两个数相同的卷积核,因此这种情况只需要写kernel_size=5这样的就行了。如果左右两个数不同,比如3x5的卷积核,那么写作kernel_size = (3, 5)。
stride=1:卷积核在图像窗口上每次平移的间隔,即所谓的步长。
padding=0:Padding即所谓的图像填充,后面的int型常数代表填充的多少(行数、列数),默认为0。需要注意的是这里的填充包括图像的上下左右,以padding=1为例,若原始图像大小为32x32,那么padding后的图像大小就变成了34x34,而不是33x33。
groups=1:决定了是否采用分组卷积。
bias=True:即是否要添加偏置参数作为可学习参数的一个,默认为True。
padding_mode=‘zeros’:即padding的模式,默认采用零填充。

Avgpool

池化层主要用于尺度变换,提取高维特征。其中一种池化为局部池化,在图像维度上几个相邻的点被缩减为一个输出点,在 Channel 维度上不变。包括平均池化(AvgPool), 最大值(MaxPool), 范数(LpPool)。主要用于图像的尺寸变换。以二维平均池化为例,在pytorch中查得如下:
torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)
kernel_size:池化核的尺寸大小。
stride:窗口的移动步幅,默认与kernel_size大小一致。
padding:在两侧的零填充宽度大小。
ceil_mode:设为True时,在计算输出形状的过程中采用向上取整的操作,否则,采用向下取整。
count_include_pad:布尔类型,当为True时,将在平均池化计算中包括零填充,否则,不包括零填充。
divisor_override:如果被指定,则除数会被代替成divisor_override。换句话说,如果不指定该变量,则平均池化的计算过程其实是在一个池化核内,将元素相加再除以池化核的大小,也就是divisor_override默认为池化核的高×宽;如果该变量被指定,则池化过程为将池化核内元素相加再除以divisor_override。

神经网络的优化方法

1.优化的目标

尽管优化提供了一种最大限度地减少深度学习损失函数的方法,但实质上,优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。例如,训练误差和泛化误差通常不同:由于优化算法的目标函数通常是基于训练数据集的损失函数,因此优化的目标是减少训练误差。但是,深度学习(或更广义地说,统计推断)的目标是减少泛化误差(反映了学习方法的泛化能力)。为了实现后者,除了使用优化算法来减少训练误差之外,我们还需要注意过拟合。

2.优化什么

最优化算法有三要素:变量(Decision Variable)、约束条件(Constraints)和目标函数(Objective function)。而优化分为参数优化和超参数优化:参数,指模型f(x;Θ)中的Θ称为模型的参数,可以通过优化算法进行自动学习得到。超参数,指用来定义模型结构或优化策略。

3.优化中存在的挑战

(1)局部最小值
深度学习模型的目标函数通常有许多局部最优解。当优化问题的数值解接近局部最优值时,随着目标函数解的梯度接近或变为零,通过最终迭代获得的数值解可能仅使目标函数局部最优,而不是全局最优。

(2)鞍点
除了局部最小值之外,鞍点也是梯度消失的另一个原因。鞍点(saddle point)是指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。如f(x)=x^3,它的一阶和二阶导数在x=0时消失。这时优化可能会停止,尽管它不是最小值。

(3)梯度消失
可能遇到的最隐蔽的问题是梯度消失。假设我们想最小化函数f(x)=tanh(x),然后我们恰好从x=4开始。正如我们所看到的那样,f’的梯度接近零。更具体地说,f’(x)=1-(tanh(x))^2,因此是f’(4)=0.0013。因此,在我们取得进展之前,优化将会停滞很长一段时间。事实证明,这是在引入ReLU激活函数之前训练深度学习模型相当棘手的原因之一。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lRt1RwuU-1653639509103)(https://zh-v2.d2l.ai/_images/output_optimization-intro_70d214_78_0.svg)]

4.凸函数

十分简单粗暴的通过几何举例来说,凸函数为定义域中任意两点连线组成的线段都在这两点的函数曲线(面)上方的函数。

凸函数有一个有意思的特性,即局部极小值是全局极小值。我们可以通过该函数来验证优化算法,如果该算法甚至在凸性条件设定下的效果很差,通常我们很难在其他条件下看到好的结果。

5.梯度下降

(1)梯度下降
梯度下降是一种用于寻找局部最小值或优化损失函数的一阶优化技术,它也被称为参数优化技术。“梯度”是指某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。那么我们朝着梯度的反方向变动,函数值下降最快。这就是梯度下降的意义所在,它能使我们可以搜索到局部最小值。

上面的公式就是梯度下降法的基本形式,其中η是学习率,ΔJ(θ)是损失函数,J(θ)关于模型参数θ的梯度。
梯度下降的特点:
①对于凸函数,肯定可以找到全局最优,对于非凸目标函数,可以找到局部最优。
②每次更新都对整个数据集进行计算,计算量大。
③学习率的大小很重要:学习率太大会使模型发散,学习率太小会没有进展。

(2)随机梯度下降

随机梯度下降法和梯度下降法其实是走的两个极端,梯度下降法是每次更新都计算整个数据集的loss,而随机梯度下降法每次更新都只用了一对样本,即上面公式中的一对样本(xi,yi)。由于每个样本都会对模型进行更新,所以模型更新的特别频繁,参数就会变成高方差,损失函数的波动也会有很大强度的变化。有时候,这是好事,因为这样的可以帮助我们探索新的更新方向,找到更加好的局部极值点。但是,由于频繁的更新和波动,会导致模型的损失收敛的非常不稳定。
随机梯度下降特点:
①每次只用一个样本进行更新,计算量小,更新频率高。
②容易导致模型超调不稳定,收敛也不稳定。
③当训练数据集中有更多样本时,计算梯度下降的每次迭代的代价更高,因此在这些情况下,首选随机梯度下降。

(3)小批量随机梯度下降
小批量随机梯度下降是梯度下降和随机梯度下降的折中方案,即在计算loss的时候,既不是直接计算整个数据集的loss,也不是只计算一个样本的loss,而是计算一个batch的loss,batch的大小自己设定。batch越大,loss下降越明显;适当小的batch会更快收敛。batch越大,越有可能收敛到尖锐的最小值;batch越小越有可能收敛到平坦最小值。

小批量随机梯度下降特点:
①每次更新模型时,采用一部分数据进行计算。
②一般来说,小批量随机梯度下降比随机梯度下降和梯度下降的速度快,收敛风险较小。

(4)动量法
带momentum(动量)的梯度下降法也是一种很常用的的优化算法。这种方法因为引入了momentum量,所以能够对梯度下降法起到加速的作用。打个比方,一个球顺着斜坡往下滚动,会因为地心引力的原因而一直加速,速度越来越快的往坡低滚去。梯度下降法中的Momentum量就和地心引力的作用很类似,能够让梯度下降法沿着下降的方向逐渐扩大幅度。起到对梯度下降法进行加速的作用。

从上述公式(1)可以看出,当当前的梯度方向(ΔJ(θ)的正负号)和V(t−1)的方向相同时,V(t)>ηΔJ(θ)所以参数 θ的变化幅度会增大,从而加快梯度下降法的幅度;而当方向不同时,会逐步减小当前更新的幅度。这样可以有效的对梯度下降法进行加速,同时提高模型的稳定性。
momentum特点:
①动量法的实现非常简单,但它需要我们存储额外的状态向量(动量)。
②能够更快更稳定的收敛。
③能够减少模型的波动震荡。

Nesterov他发现Momentum方法中存在一个问题。当我们把球放在斜坡上,小球会一直往下滚动,并且越滚越快,当球到达坡底时,速度最快。我们的目的是让小球能够停在坡底,可是当小球到达坡底时,由于仍旧有较大的速度,小球会往另一个方向爬坡,并不会稳稳的停在谷底。具体到梯度下降法,就是Momentum方法在极值附近不能进行提前减速,且在极值附近仍旧以较大的幅度进行改变,有时候可能就直接跳出了这个极值。为了解决这一问题,Nesterov就提出了 Nestrov Accelerated Gradient(NAG)。
NAG算法简而言之,就是在进行Momentum梯度下降法之前,先做一个预演,看看沿着以前的方向进行更新是否合适,不合适就立马调整方向。也就是说参数更新的方向不再是当前的梯度方向,而是参数未来所要去的真正方向。

NAG特点:
能够在对梯度下降法进行加速的同时,提高稳定性,避免越过极值。

(5)Adagrad
前面讲了小批量随机梯度下降法中,因为对所有的参数均使用相同的学习率,而当有的参数的梯度很大,有的很小时,显然不合适。另外,对于不同的样本,如果有的样本出现的较为频繁,导致其对应的一些参数更新较为频繁,而有的样本出现的频率很低,导致一些参数更新频率很低时,再采用相同的学习率有时候也不太合适。我们更加希望那些出现更新频率比较低的参数能够有更大的更新幅度。因此我们采用Adagrad算法,根据每个参数以前的梯度情况,对不同参数使用不同的学习率,同时动态调整参数学习率。

(6)AdaDelta
AdaDelta是Adagrad的改进版,目的就是解决Adagrad在训练的后期,学习率变得非常小,降低模型收敛速度。AdaGrad方法是完全累计先前所有梯度的平方和,AdaDelta则是添加一个衰减系数w用来减小很久以前的梯度对当前训练的影响,从而避免学习率无限减小的问题。

(7)Adam
前面我们从最经典的梯度下降法开始,介绍了几个改进版的梯度下降法:
Momentum方法通过添加动量,提高收敛速度;
Nesterov方法在进行当前更新前,先进行一次预演,从而找到一个更加适合当前情况的梯度方向和幅度;
Adagrad让不同的参数拥有不同的学习率,并且通过引入梯度的平方和作为衰减项,而在训练过程中自动降低学习率;
AdaDelta则对Adagrad进行改进,让模型在训练后期也能够有较为适合的学习率。
既然不同的参数可以有不同的学习率,那么不同的参数是不是也可以有不同的Momentum呢?Adam方法就是根据上述思想而提出的,对于每个参数,其不仅仅有自己的学习率,还有自己的Momentum量,这样在训练的过程中,每个参数的更新都更加具有独立性,提升了模型训练速度和训练的稳定性。

(8)总结
事实上,如果你的数据比较稀疏,那么像SGD,NAG以及Momentum的方法往往会表现的比较差,这是因为对于模型中的不同参数,他们均使用相同的学习率,这会导致那些应该更新快的参数更新的慢,而应该更新慢的有时候又会因为数据的原因的变得快。因此,对于稀疏的数据更应该使用Adaptive方法(Adagrad、AdaDelta、Adam)。同样,对于一些深度神经网络或者非常复杂的神经网络,使用Adam或者其他的自适应(Adaptive)的方法也能够更快的收敛。

实践——对项目进行优化

项目介绍

使用RNN模型构建人名分类器,使得最后模型可以输入姓氏,然后猜测出国家。

项目代码

# 人名分类器
from io import open
import glob
import string
import unicodedata
import random
import time
import math
import torch
import torch.nn as nn
import matplotlib.pyplot as plt# string.ascii_letters 是大小写各26字母
all_letters = string.ascii_letters + " .,;'"
# 字符的种类数
n_letters = len(all_letters)# 将Unicode码转换成标准的ASCII码
def unicode_to_ascii(s):return ''.join(c for c in unicodedata.normalize('NFD', s)if unicodedata.category(c) != 'Mn'and c in all_letters)print(n_letters)  # 字符数为57个all_filenames = glob.glob('./data/names/*.txt')
category_names = {}
# 所有类别
all_categories = []# 读取txt文件,返回 ascii 码的姓名 列表
def readNames(filename):names = open(filename).read().strip().split('\n')return [unicode_to_ascii(name) for name in names]for filename in all_filenames:category = filename.split('/')[-1].split('.')[0]all_categories.append(category)names = readNames(filename)category_names[category] = names
# 语言种类数
n_categories = len(all_categories)
print('n_categories =', n_categories)# 将字符转化为 <1 *  n_letters> 的 Tensor
def letter_to_tensor(letter):tensor = torch.zeros(1, n_letters)letter_index = all_letters.find(letter)tensor[0][letter_index] = 1return tensor# 将姓名转化成尺寸为<name_length * 1 * n_letters>的数据
# 使用的是 one-hot 编码方式转化
def name_to_tensor(name):tensor = torch.zeros(len(name), 1, n_letters)for ni, letter in enumerate(name):letter_index = all_letters.find(letter)tensor[ni][0][letter_index] = 1return tensorprint(letter_to_tensor('J'))
print(name_to_tensor('Jones'))class RNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(RNN, self).__init__()self.input_size = input_sizeself.hidden_size = hidden_sizeself.output_size = output_sizeself.i2h = nn.Linear(input_size + hidden_size, hidden_size)self.i2o = nn.Linear(input_size + hidden_size, output_size)def forward(self, input, hidden):# 将input和之前的网络中的隐藏层参数合并。combined = torch.cat((input, hidden), 1)hidden = self.i2h(combined)  # 计算隐藏层参数output = self.i2o(combined)  # 计算网络输出的结果return output, hiddendef init_hidden(self):# 初始化隐藏层参数hiddenreturn torch.zeros(1, self.hidden_size)# 测试模型
# input = letter_to_tensor('A')
# hidden = rnn.init_hidden()
# output, next_hidden = rnn(input, hidden)
# print('output.size =', output.size())
# print(output)def category_from_output(output):_, top_i = output.data.topk(1)category_i = top_i[0][0]return all_categories[category_i], category_idef random_training_pair():# 随机抽取了一种语言category = random.choice(all_categories)# 在该语言中抽取一个姓名name = random.choice(category_names[category])# 由于pytorch中训练过程中使用的都是tensor结构数据,其中的元素都是浮点型数值,所以这里我们使用LongTensor, 可以保证标签是整数。# 另外要注意的是,pytorch中运算的数据都是batch。所以我们要将所属语言的索引值放入一个list中,再将该list传入torch.LongTensor()中category_tensor = torch.LongTensor([all_categories.index(category)])name_tensor = name_to_tensor(name)return category, name, category_tensor, name_tensordef train(category_tensor, name_tensor):rnn.zero_grad()  # 将rnn网络梯度清零hidden = rnn.init_hidden()  # 只对姓名的第一字母构建起hidden参数# 对姓名的每一个字母逐次学习规律。每次循环的得到的hidden参数传入下次rnn网络中for i in range(name_tensor.size()[0]):output, hidden = rnn(name_tensor[i], hidden)# 比较最终输出结果与 该姓名真实所属语言,计算训练误差loss = criterion(output, category_tensor)# 将比较后的结果反向传播给整个网络loss.backward()# 调整网络参数。有则改之无则加勉optimizer.step()# 返回预测结果  和 训练误差return output, loss.item()def time_since(since):# 计算训练使用的时间now = time.time()s = now - sincem = math.floor(s / 60)s -= m * 60return '%dm %ds' % (m, s)def predict(rnn, input_name, n_predictions=3):"""模型预测"""hidden = rnn.init_hidden()# name_tensor.size()[0] 名字的长度(字母的数目)name_tensor = name_to_tensor(input_name)for i in range(name_tensor.size()[0]):output, hidden = rnn(name_tensor[i], hidden)print('\n> %s' % input_name)# 得到该姓名预测结果中似然值中前n_predictions大的 似然值和所属语言topv, topi = output.data.topk(n_predictions, 1, True)for i in range(n_predictions):value = topv[0][i]category_index = topi[0][i]print('(%.2f) %s' % (value, all_categories[category_index]))if __name__ == '__main__':# 初始化模型rnn = RNN(input_size=57,  # 输入每个字母向量的长度(57个字符)hidden_size=128,  # 隐藏层向量的长度,神经元个数。这里可自行调整参数大小output_size=18)  # 语言的种类数目# 损失函数criterion = nn.CrossEntropyLoss()# 定义优化器learning_rate = 0.005optimizer = torch.optim.SGD(rnn.parameters(),  # 给优化器传入rnn网络参数lr=learning_rate, momentum=0.001)  # 学习率# 模型训练n_epochs = 100000  # 训练100000次(可重复的从数据集中抽取100000姓名)print_every = 5000  # 每训练5000次,打印一次plot_every = 1000  # 每训练1000次,计算一次训练平均误差current_loss = 0  # 初始误差为0all_losses = []  # 记录平均误差# 训练开始时间点start = time.time()for epoch in range(1, n_epochs + 1):# 随机的获取训练数据name和对应的languagecategory, name, category_tensor, name_tensor = random_training_pair()output, loss = train(category_tensor, name_tensor)current_loss += loss# 每训练5000次,预测一个姓名,并打印预测情况if epoch % print_every == 0:guess, guess_i = category_from_output(output)correct = 'True' if guess == category else 'False (%s)' % categoryprint('%d %d%% (%s) %.4f %s / %s %s' % (epoch, epoch / n_epochs * 100, time_since(start), loss, name, guess, correct))# 每训练5000次,计算一个训练平均误差,方便后面可视化误差曲线图if epoch % plot_every == 0:all_losses.append(current_loss / plot_every)current_loss = 0# 损失绘图plt.figure()plt.plot(all_losses)plt.show()# 预测模型predict(rnn, 'Shang')predict(rnn, 'Jackson')predict(rnn, 'ZHU')# 模型保存# torch.save(rnn.state_dict(), './model/model_NameClassification.pth')# 加载模型与测试# 首先实例化模型的类对象# net = Net()# 加载训练阶段保存好的模型的状态字典# rnn.load_state_dict(torch.load('./model/model_NameClassification.pth'))# 利用模型对图片进行预测# outputs = net(images)# 共有10个类别, 采用模型计算出的概率最大的作为预测的类别# _, predicted = torch.max(outputs, 1)# 打印预测标签的结果# print('Predicted: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))# 模型测试# predict(rnn, 'Shang')# predict(rnn, 'Wang')# predict(rnn, 'ZHU')

项目优化

其输出先是每训练5%,预测一个姓名,并打印预测情况,且计算一个训练平均误差。最后生成一个可视化的误差曲线图,并且输出三次模型预测结果(包含似然值)。

1.调整学习率

学习率:0.005(初始)

5000 5% (0m 5s) 2.5113 Haanraats / names\Greek False (names\Dutch)
10000 10% (0m 9s) 1.5832 Gu / names\Vietnamese False (names\Korean)
15000 15% (0m 13s) 5.2869 Theohari / names\Japanese False (names\Greek)
20000 20% (0m 18s) 1.7411 Suero / names\Portuguese False (names\Spanish)
25000 25% (0m 22s) 0.9412 O'Halloran / names\Irish True
30000 30% (0m 26s) 2.7797 Galler / names\German False (names\Russian)
35000 35% (0m 30s) 0.1913 Ishimaru / names\Japanese True
40000 40% (0m 34s) 1.3049 Bang / names\Vietnamese False (names\Korean)
45000 45% (0m 38s) 2.4805 Dubois / names\Greek False (names\French)
50000 50% (0m 42s) 1.0581 Ma / names\Korean False (names\Vietnamese)
55000 55% (0m 46s) 0.5040 Joshuya / names\Japanese True
60000 60% (0m 51s) 0.5913 Nguyen / names\Vietnamese True
65000 65% (0m 55s) 2.2019 Fall / names\Irish False (names\English)
70000 70% (0m 59s) 0.0264 Timiskov / names\Russian True
75000 75% (1m 3s) 0.7592 Jankilevsky / names\Russian True
80000 80% (1m 7s) 2.3204 Martel / names\Arabic False (names\French)
85000 85% (1m 11s) 1.7652 Duval / names\Irish False (names\French)
90000 90% (1m 15s) 1.3522 Hoang / names\Vietnamese True
95000 95% (1m 19s) 1.9119 Wiater / names\Czech False (names\Polish)
100000 100% (1m 23s) 0.0759 Zhilov / names\Russian True> Shang
(5.32) names\Chinese
(3.13) names\Korean
(2.89) names\Vietnamese> Jackson
(4.07) names\English
(3.52) names\Scottish
(2.85) names\Russian> ZHU
(3.29) names\Korean
(2.91) names\Chinese
(1.70) names\Vietnamese

学习率:0.01

5000 5% (0m 5s) 1.3944 Weng / names\Chinese True
10000 10% (0m 9s) 1.5547 Mendes / names\Dutch False (names\Portuguese)
15000 15% (0m 13s) 3.4783 Baba / names\Vietnamese False (names\Arabic)
20000 20% (0m 17s) 1.9803 Seto / names\Chinese True
25000 25% (0m 21s) 1.9706 Pini / names\Chinese False (names\Italian)
30000 30% (0m 25s) 2.7302 Tsen / names\Dutch False (names\Chinese)
35000 35% (0m 29s) 1.7117 Rana / names\Spanish False (names\Italian)
40000 40% (0m 33s) 0.9330 Cuocco / names\Italian True
45000 45% (0m 37s) 4.6422 Schwangau / names\Irish False (names\German)
50000 50% (0m 41s) 0.5882 Hao / names\Chinese True
55000 55% (0m 45s) 0.2816 Svocak / names\Czech True
60000 60% (0m 49s) 1.3778 Mai / names\Chinese False (names\Vietnamese)
65000 65% (0m 53s) 1.9529 Kuno / names\Korean False (names\Japanese)
70000 70% (0m 58s) 0.2033 Roggeveen / names\Dutch True
75000 75% (1m 2s) 0.2466 Gibson / names\Scottish True
80000 80% (1m 6s) 2.9217 Ackermann / names\Irish False (names\German)
85000 85% (1m 10s) 1.7064 Downton / names\Scottish False (names\English)
90000 90% (1m 14s) 0.3510 Hang / names\Chinese True
95000 95% (1m 18s) 2.1406 Casales / names\Greek False (names\Spanish)
100000 100% (1m 22s) 1.6928 Mateus / names\Arabic False (names\Portuguese)> Shang
(4.71) names\Chinese
(2.45) names\Korean
(1.91) names\Dutch> Jackson
(7.17) names\Scottish
(3.03) names\English
(2.56) names\Czech> ZHU
(5.37) names\Vietnamese
(4.97) names\Chinese
(4.70) names\Korean

学习率:0.05

5000 5% (0m 5s) nan Diep / names\Arabic False (names\Vietnamese)
10000 10% (0m 9s) nan Chai / names\Arabic False (names\Chinese)
15000 15% (0m 13s) nan Bell / names\Arabic False (names\Scottish)
20000 20% (0m 17s) nan Grka / names\Arabic False (names\Polish)
25000 25% (0m 21s) nan Wyrzyk / names\Arabic False (names\Polish)
30000 30% (0m 25s) nan Silje / names\Arabic False (names\Dutch)
35000 35% (0m 29s) nan Tayama / names\Arabic False (names\Japanese)
40000 40% (0m 33s) nan Jarzembowski / names\Arabic False (names\Czech)
45000 45% (0m 37s) nan Rodrigues / names\Arabic False (names\Portuguese)
50000 50% (0m 41s) nan Moreno / names\Arabic False (names\Portuguese)
55000 55% (0m 45s) nan Shimakage / names\Arabic False (names\Japanese)
60000 60% (0m 50s) nan Auer / names\Arabic False (names\German)
65000 65% (0m 54s) nan Ungaro / names\Arabic False (names\Italian)
70000 70% (0m 58s) nan Schrijnemakers / names\Arabic False (names\Dutch)
75000 75% (1m 2s) nan Nakata / names\Arabic False (names\Japanese)
80000 80% (1m 6s) nan Alves / names\Arabic False (names\Spanish)
85000 85% (1m 10s) nan Laguardia / names\Arabic False (names\Italian)
90000 90% (1m 14s) nan Stawski / names\Arabic False (names\Polish)
95000 95% (1m 18s) nan Panoulias / names\Arabic False (names\Greek)
100000 100% (1m 22s) nan Truong / names\Arabic False (names\Vietnamese)> Shang
(nan) names\Arabic
(nan) names\Chinese
(nan) names\Czech> Jackson
(nan) names\Arabic
(nan) names\Chinese
(nan) names\Czech> ZHU
(nan) names\Arabic
(nan) names\Chinese
(nan) names\Czech

学习率:0.001

5000 5% (0m 6s) 2.7471 Boerio / names\Italian True
10000 10% (0m 10s) 2.7900 Morava / names\Japanese False (names\Czech)
15000 15% (0m 15s) 2.8618 Ebergard / names\French False (names\Russian)
20000 20% (0m 20s) 2.9659 Fava / names\Japanese False (names\Italian)
25000 25% (0m 25s) 2.8958 Rich / names\Vietnamese False (names\English)
30000 30% (0m 30s) 2.5433 Hodowal / names\Irish False (names\Czech)
35000 35% (0m 34s) 2.5689 Kawashima / names\Russian False (names\Japanese)
40000 40% (0m 39s) 3.2684 Gonzales / names\Greek False (names\Spanish)
45000 45% (0m 44s) 1.6633 Jeon / names\Korean True
50000 50% (0m 48s) 3.5220 Vainer / names\German False (names\Russian)
55000 55% (0m 53s) 2.1715 Rousses / names\Dutch False (names\Greek)
60000 60% (0m 57s) 1.9621 Santos / names\Greek False (names\Portuguese)
65000 65% (1m 2s) 1.1372 Vingranovsky / names\Polish False (names\Russian)
70000 70% (1m 6s) 2.1474 Pylin / names\Scottish False (names\Russian)
75000 75% (1m 11s) 1.2379 Ho / names\Korean True
80000 80% (1m 15s) 4.1883 Maly / names\Irish False (names\Polish)
85000 85% (1m 20s) 2.3571 Fabre / names\Arabic False (names\French)
90000 90% (1m 25s) 1.2906 Pavlishin / names\Russian True
95000 95% (1m 29s) 4.0326 Jez / names\Chinese False (names\Polish)
100000 100% (1m 34s) 2.4252 Forst / names\Czech False (names\German)> Shang
(4.62) names\Vietnamese
(4.42) names\Chinese
(3.65) names\Korean> Jackson
(2.57) names\Russian
(2.55) names\Scottish
(1.91) names\Polish> ZHU
(3.12) names\Chinese
(2.92) names\Korean
(2.77) names\Vietnamese

学习率:0.0005

5000 5% (0m 5s) 2.7494 Stavropoulos / names\Greek True
10000 10% (0m 9s) 2.9661 Salazar / names\Arabic False (names\Portuguese)
15000 15% (0m 14s) 2.7776 Marchetti / names\Japanese False (names\Italian)
20000 20% (0m 19s) 2.9109 O'Malley / names\Dutch False (names\Irish)
25000 25% (0m 24s) 2.8231 Vuong / names\Chinese False (names\Vietnamese)
30000 30% (0m 29s) 2.8473 Mifsud / names\English False (names\Arabic)
35000 35% (0m 34s) 2.8584 Vo / names\Portuguese False (names\Vietnamese)
40000 40% (0m 40s) 2.6692 Matejka / names\Japanese False (names\Czech)
45000 45% (0m 45s) 2.6317 Martin / names\Irish False (names\Scottish)
50000 50% (0m 50s) 2.7618 Thao / names\Chinese False (names\Vietnamese)
55000 55% (0m 55s) 2.5363 Castro / names\Italian False (names\Portuguese)
60000 60% (1m 0s) 0.9176 Kotsilimbas / names\Greek True
65000 65% (1m 5s) 2.4942 Bisset / names\English False (names\French)
70000 70% (1m 10s) 2.5886 Castell / names\Czech False (names\Spanish)
75000 75% (1m 15s) 2.8023 Rumpade / names\English False (names\Dutch)
80000 80% (1m 20s) 2.4135 Treasach / names\Japanese False (names\Irish)
85000 85% (1m 25s) 2.7851 Kurtz / names\Arabic False (names\Czech)
90000 90% (1m 30s) 2.5070 Ukiyo / names\Portuguese False (names\Japanese)
95000 95% (1m 35s) 2.1825 Cardozo / names\Italian False (names\Portuguese)
100000 100% (1m 40s) 1.5752 Hor / names\Korean False (names\Chinese)> Shang
(1.98) names\Chinese
(1.85) names\Vietnamese
(1.78) names\Korean> Jackson
(1.99) names\Scottish
(1.76) names\Russian
(1.73) names\Irish> ZHU
(2.21) names\Korean
(2.13) names\Chinese
(1.94) names\Vietnamese

可以发现当学习率越大,训练误差也就越大,也就是使模型发散。而学习率越小,训练误差也会上升,但没那么明显,但是预测结果很多出错,也就是训练没有进展。由此可见学习率不能太大也不能太小。

2.加入动量

momentum=0.001

5000 5% (0m 5s) 2.7193 Shammas / names\Greek False (names\Arabic)
10000 10% (0m 10s) 2.0931 Janick / names\Czech True
15000 15% (0m 14s) 1.6853 Romeijn / names\Dutch True
20000 20% (0m 19s) 1.7652 Quyen / names\Korean False (names\Vietnamese)
25000 25% (0m 23s) 1.4695 Jiang / names\Vietnamese False (names\Chinese)
30000 30% (0m 27s) 1.4248 Bui / names\Chinese False (names\Vietnamese)
35000 35% (0m 32s) 1.1541 Giang / names\Vietnamese True
40000 40% (0m 36s) 0.6756 Zhai / names\Chinese True
45000 45% (0m 41s) 3.0392 Trudu / names\French False (names\Italian)
50000 50% (0m 46s) 0.9301 Agteren / names\Dutch True
55000 55% (0m 50s) 3.0062 Kennedy / names\German False (names\Irish)
60000 60% (0m 55s) 1.8420 Janda / names\Czech False (names\Polish)
65000 65% (0m 59s) 4.2927 Farrar / names\Arabic False (names\English)
70000 70% (1m 4s) 0.3162 O'Halloran / names\Irish True
75000 75% (1m 8s) 1.5967 Sartre / names\French True
80000 80% (1m 13s) 1.3145 Brown / names\Scottish True
85000 85% (1m 18s) 0.5713 Guirguis / names\Arabic True
90000 90% (1m 22s) 0.5922 Vicario / names\Italian True
95000 95% (1m 27s) 1.5613 Beck / names\Czech False (names\German)
100000 100% (1m 31s) 1.5214 Sissons / names\Japanese False (names\English)> Shang
(3.82) names\Chinese
(3.19) names\Vietnamese
(2.98) names\Korean> Jackson
(4.82) names\English
(4.58) names\Scottish
(4.07) names\Russian> ZHU
(3.19) names\Vietnamese
(3.10) names\Korean
(2.99) names\Chinese

momentum=0.05

5000 5% (0m 5s) 2.9003 Quang / names\Italian False (names\Vietnamese)
10000 10% (0m 9s) 2.7772 Votke / names\Polish False (names\Czech)
15000 15% (0m 14s) 2.3819 Venne / names\German False (names\Dutch)
20000 20% (0m 18s) 1.3271 Geiger / names\German True
25000 25% (0m 23s) 3.1686 Teague / names\Arabic False (names\English)
30000 30% (0m 27s) 2.6943 Tron / names\Scottish False (names\Vietnamese)
35000 35% (0m 32s) 0.7485 Yuhara / names\Japanese True
40000 40% (0m 36s) 1.9704 Gray / names\Scottish True
45000 45% (0m 41s) 1.5229 O'Hare / names\Irish True
50000 50% (0m 45s) 0.6457 Gniewek / names\Polish True
55000 55% (0m 49s) 0.7619 Polymenakou / names\Greek True
60000 60% (0m 54s) 3.9470 Maus / names\Portuguese False (names\German)
65000 65% (0m 58s) 0.1518 Mccallum / names\Scottish True
70000 70% (1m 2s) 3.5986 Zis / names\Chinese False (names\Russian)
75000 75% (1m 7s) 0.1337 Coghlan / names\Irish True
80000 80% (1m 11s) 1.5432 Milne / names\Irish False (names\Scottish)
85000 85% (1m 15s) 1.6170 Duncan / names\Scottish True
90000 90% (1m 20s) 0.2568 Damhain / names\Irish True
95000 95% (1m 24s) 1.3288 Sakubara / names\Polish False (names\Japanese)
100000 100% (1m 28s) 0.6813 Lim  / names\Korean True> Shang
(6.20) names\Chinese
(4.04) names\Korean
(3.58) names\Vietnamese> Jackson
(6.22) names\Scottish
(3.29) names\Russian
(2.88) names\English> ZHU
(3.98) names\Korean
(3.71) names\Chinese
(3.26) names\Vietnamese

momentum=0.01

5000 5% (0m 5s) 1.5387 Rzhanitsin / names\Russian True
10000 10% (0m 10s) 1.0532 Ladyjnikov / names\Russian True
15000 15% (0m 15s) 1.4268 Than / names\Chinese False (names\Vietnamese)
20000 20% (0m 20s) 1.3458 Maroun / names\Arabic True
25000 25% (0m 24s) 1.9489 Nuallan / names\Scottish False (names\Irish)
30000 30% (0m 29s) 1.7013 Lobo / names\Portuguese True
35000 35% (0m 33s) 1.3424 Chevrolet / names\French True
40000 40% (0m 38s) 0.1565 Ishihara / names\Japanese True
45000 45% (0m 43s) 2.4257 Edgar / names\Scottish False (names\English)
50000 50% (0m 47s) 1.2308 Mckay / names\Scottish True
55000 55% (0m 52s) 0.5496 Ribeiro / names\Portuguese True
60000 60% (0m 57s) 0.2144 Okuda / names\Japanese True
65000 65% (1m 1s) 2.0489 Lobo / names\Spanish False (names\Portuguese)
70000 70% (1m 6s) 1.3552 Tremble / names\English False (names\French)
75000 75% (1m 10s) 2.2117 Forsyth / names\Italian False (names\English)
80000 80% (1m 15s) 1.9686 Kitson / names\Arabic False (names\English)
85000 85% (1m 19s) 1.0013 Xiang / names\Chinese True
90000 90% (1m 24s) 0.1665 Stroggylis / names\Greek True
95000 95% (1m 28s) 0.0715 O'Boyle / names\Irish True
100000 100% (1m 32s) 1.3992 Sacco / names\Portuguese False (names\Italian)> Shang
(4.68) names\Chinese
(2.82) names\Korean
(1.93) names\Vietnamese> Jackson
(6.20) names\Scottish
(3.98) names\English
(3.48) names\Russian> ZHU
(4.53) names\Korean
(3.76) names\Chinese
(2.60) names\Vietnamese

momentum=0.01, nesterov=True

5000 5% (0m 6s) 1.9992 Tang / names\Chinese True
10000 10% (0m 10s) 2.4747 Weisener / names\Dutch False (names\Czech)
15000 15% (0m 15s) 2.1884 Koury / names\Arabic True
20000 20% (0m 19s) 2.4505 Daniels / names\Spanish False (names\English)
25000 25% (0m 24s) 1.8690 Awad / names\Arabic True
30000 30% (0m 28s) 2.0262 Aggelen / names\Irish False (names\Dutch)
35000 35% (0m 33s) 2.6851 Feltham / names\Irish False (names\English)
40000 40% (0m 37s) 4.1896 Pan / names\Vietnamese False (names\French)
45000 45% (0m 42s) 1.6270 Timpy / names\Irish False (names\Czech)
50000 50% (0m 46s) 0.9825 Iturburua / names\Spanish True
55000 55% (0m 51s) 0.2265 Millar / names\Scottish True
60000 60% (0m 56s) 0.3276 Katsourinis / names\Greek True
65000 65% (1m 0s) 1.0941 Ma / names\Korean False (names\Vietnamese)
70000 70% (1m 5s) 3.3584 Hout / names\Arabic False (names\Dutch)
75000 75% (1m 9s) 1.8090 Kieu / names\Chinese False (names\Vietnamese)
80000 80% (1m 14s) 0.4541 Stenger / names\German True
85000 85% (1m 19s) 2.5583 Seaghdha / names\Japanese False (names\Irish)
90000 90% (1m 23s) 0.7983 Guerra / names\Portuguese True
95000 95% (1m 28s) 1.5282 Hanek / names\Czech True
100000 100% (1m 33s) 1.8687 Deschamps / names\Dutch False (names\French)> Shang
(5.00) names\Chinese
(3.98) names\Vietnamese
(2.41) names\Korean> Jackson
(4.05) names\Scottish
(4.03) names\English
(2.93) names\Russian> ZHU
(3.84) names\Korean
(3.39) names\Chinese
(2.77) names\Vietnamese

加入向量后,模型训练速度有一定下降,而预测结果的似然值有一定程度上升,说明加入向量并调好参数后能起到优化作用,而nesterov开启与否在SGD中似乎影响不大。

3.AdaGrad

5000 5% (0m 6s) 2.6306 Sarto / names\Portuguese False (names\Italian)
10000 10% (0m 11s) 2.4943 Jameson / names\Russian False (names\English)
15000 15% (0m 16s) 0.6134 Strilakos / names\Greek True
20000 20% (0m 22s) 2.1872 Henriques / names\Dutch False (names\Portuguese)
25000 25% (0m 27s) 0.7897 Mikhasenko / names\Russian True
30000 30% (0m 32s) 2.0565 Alamilla / names\Italian False (names\Spanish)
35000 35% (0m 37s) 1.7228 Baik / names\Korean True
40000 40% (0m 42s) 2.8399 Mata / names\Japanese False (names\Portuguese)
45000 45% (0m 47s) 1.0438 Mulryan / names\Irish True
50000 50% (0m 53s) 5.4908 Mas / names\Chinese False (names\German)
55000 55% (0m 58s) 0.7770 Johnston / names\Scottish True
60000 60% (1m 3s) 3.0180 Gouveia / names\Greek False (names\Portuguese)
65000 65% (1m 8s) 1.5109 Vacca / names\Spanish False (names\Italian)
70000 70% (1m 14s) 1.7079 Larue / names\Portuguese False (names\French)
75000 75% (1m 19s) 2.4000 Costa / names\Czech False (names\Portuguese)
80000 80% (1m 24s) 2.5048 Lorentz / names\Spanish False (names\German)
85000 85% (1m 29s) 0.8610 Nolan / names\Irish True
90000 90% (1m 35s) 0.2251 Yushkevich / names\Russian True
95000 95% (1m 40s) 3.1454 Raske / names\Polish False (names\German)
100000 100% (1m 45s) 5.1364 Tenshin / names\Irish False (names\Japanese)> Shang
(4.21) names\Chinese
(2.98) names\Vietnamese
(2.66) names\Korean> Jackson
(5.73) names\Scottish
(4.25) names\English
(4.16) names\Russian> ZHU
(3.65) names\Korean
(3.59) names\Chinese
(2.36) names\Vietnamese

4.Adam

5000 5% (0m 6s) 1.3608 Stanek / names\Polish True
10000 10% (0m 12s) 0.3173 Karahalios / names\Greek True
15000 15% (0m 18s) 2.9204 Vestman / names\German False (names\Russian)
20000 20% (0m 23s) 0.9499 Hama / names\Japanese True
25000 25% (0m 29s) 0.2780 Tuleev / names\Russian True
30000 30% (0m 35s) 0.7990 Chlebek / names\Polish True
35000 35% (0m 41s) 1.2958 Leibovsky / names\Czech False (names\Russian)
40000 40% (0m 46s) 3.1814 Tosell / names\Irish False (names\Spanish)
45000 45% (0m 52s) 1.7933 Hor / names\Scottish False (names\Chinese)
50000 50% (0m 58s) 0.1689 Gorecki / names\Polish True
55000 55% (1m 3s) 0.3410 Armbruster / names\German True
60000 60% (1m 9s) 0.4956 Chu / names\Vietnamese True
65000 65% (1m 15s) 0.4299 Prchal / names\Czech True
70000 70% (1m 21s) 0.0002 Zharikov / names\Russian True
75000 75% (1m 26s) 0.0070 O'Hannigain / names\Irish True
80000 80% (1m 32s) 1.6594 Pesaro / names\Japanese False (names\Italian)
85000 85% (1m 38s) 2.3945 Hiorvst / names\French False (names\Czech)
90000 90% (1m 43s) 3.1398 Calligaris / names\Greek False (names\Italian)
95000 95% (1m 49s) 0.2569 Robertson / names\Scottish True
100000 100% (1m 55s) 0.1219 Nagatsuka / names\Japanese True> Shang
(3.82) names\Chinese
(3.09) names\Korean
(1.86) names\Vietnamese> Jackson
(4.63) names\Scottish
(2.00) names\English
(1.47) names\Russian> ZHU
(5.82) names\Korean
(5.10) names\Vietnamese
(4.88) names\Chinese

5.正则化

RNN不适合用dropout进行优化,正则化是针对处理过拟合的一些手段。

了解神经网络结构和优化方法相关推荐

  1. VALSE 2017 | 神经网络模型压缩优化方法

    ​本文 首发在个人微信公众号:计算机视觉life上. 近年来,深度神经网络在计算机视觉.语音识别等领域取得了巨大成功.为了完成更加复杂的信息处理任务,深度神经网络变得越来越深,也使得其计算量越来越大. ...

  2. 干货丨乔俊飞:面向污水处理过程控制的多目标智能优化方法研究

    乔俊飞 中国人工智能学会常务理事,北京工业大学教授,博士生导师.教育部长江学者特聘教授,国家杰出青年基金获得者,中国自动化学会理事.长期从事城市污水处理过程建模.控制与优化,在污水处理过程智能特征建模 ...

  3. 今晚直播 | 商汤科技X-Lab刘宇:神经网络结构与大规模优化方法

    「PW Live」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义, ...

  4. 积神经网络的参数优化方法——调整网络结构是关键!!!你只需不停增加层,直到测试误差不再减少....

    积神经网络(CNN)的参数优化方法 from:http://blog.csdn.net/u010900574/article/details/51992156 著名: 本文是从 Michael Nie ...

  5. 卷积神经网络结构优化综述

    卷积神经网络结构优化综述 人工智能技术与咨询 来源:<自动化学报> ,作者林景栋等 摘 要 近年来,卷积神经网络(Convolutional neural network,CNNs)在计算 ...

  6. 基于遗传算法优化神经网络结构源程序

    发信人: cooooldog (帅小呆), 信区: Num_Analysis 标  题: [分享]基于遗传算法优化神经网络结构源程序 [精华转?发信站: 日月光华 (2004年08月08日 13:56 ...

  7. 神经网络模型优化方法(缓解过拟合)

    转自:https://blog.csdn.net/chenyukuai6625/article/details/76922840 一.背景简介    在深度学习和机器学习的各种模型训练过程中,在训练数 ...

  8. YOLOV5 的小目标检测网络结构优化方法汇总(附代码)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨南山 来源丨 AI约读社 YOLOv5是一种非常受欢迎的单阶段目标检测,以其性能和速度著称,其结 ...

  9. 谷歌新技术:神经优化器搜索,自动找到可解释的优化方法

    文章来源:ATYUN AI平台 如今,深度学习模型已经部署在众多谷歌产品中,如搜索.翻译和照片等.而在训练深度学习模型时,优化方法的选择至关重要.例如,随机梯度下降在大多情况下都很有效,但更先进的优化 ...

最新文章

  1. Fiber 为什么做并发IO的时候更加高效
  2. linux进程--init进程(九)
  3. Oracle编程入门经典 第2章 SQLPlus和基本查询
  4. js调用c语言程序设计,HTML页面,测试JS对C函数的调用简单实例
  5. 休眠事实:如何“断言” SQL语句计数
  6. App Engine中的Google Services身份验证,第1部分
  7. Mendix发布全球低代码报告,中国软件与低代码发展远超全球
  8. patchGAN再次理解【相比于原始D全图输出true/false,patchGAN可以关注更多的区域】
  9. 模板匹配中差值的平方和(SSD)与互相关准则的关系
  10. 蓝桥杯泊松分酒java_【蓝桥杯】泊松分酒
  11. 几款主流的 Python IDE
  12. DotFun Silverlight 整站系统Beta版上线!
  13. OA协同办公系统对企业建设会带来什么好处?
  14. Windows 7 插件KB4474419安装 Symantec Endpoint Protection 只能安装在具有SHA-2代码签名支持更新(KB4474419)的系统上
  15. [转载]GMT地形数据总结
  16. maven setting配置超详解
  17. 你不知道的网站图片存储格式-base64
  18. XML配置文件的读取
  19. nbsp; ensp; emsp; thinsp;zwnj;zwj; 6种空白空格的区别
  20. linux磁盘阵列配置,Linux下配置磁盘阵列

热门文章

  1. tornado后端数据库查询优化方式--redis
  2. 瓴羊数据分析师LYCJ、LYCA如何报名?
  3. 弘辽科技:不花钱的淘宝免费流量,你学会了吗?
  4. ios keychain 不被清理_手机资讯:iPhone 如何在小内存下依然保证流畅的速度为什么不增加内存...
  5. 在uni-app中使用手机号一键登录
  6. Springboot3.0 打包后,tomcat启动失败
  7. 什么是winbind
  8. 信息技术主要是应用计算机科学,信息技术主要是应用计算机科学和通信技术来设计、开发、安装和实施信息系统及应用软件,主要包括( )。...
  9. 读《我真没想当救世主啊》
  10. 腹黑 HR 黑话大全:那些残忍的潜台词!