DeepLearning:训练神经网络—学习率及BatchSize

训练神经网络—学习率及batchSize


本文参考:
炼丹手册——学习率设置
【AI不惑境】学习率和batchsize如何影响模型的性能?
PyTorch 学习笔记(八):PyTorch的六个学习率调整方法

1、学习率(Learning Rate)

定义

​ 学习率是梯度下降公式中的超参数,代表了在训练神经网络时,随时间推移,信息累积的速度。学习率是最影响性能的超参数之一,选择最优学习率是很重要的,因为它决定了神经网络是否可以收敛到全局最小值,不同学习率对比如下图:

image-20211116114719622

image-20211116105411400

从上面两个图中我们可以看出:

  • 蓝线:若学习率设置的过小,训练收敛较慢,此时需要更多的epoch才能到达一个较好的局部最小值。
  • 绿线:若学习率设置的较大,训练可能会在接近局部最优点附近震荡,无法达到局部最优点。
  • 黄线:若学习率设置的特别大,那么会在山间“跳跃”难以下山。
  • 红线:合适的学习率。

调整策略

​ 在实际中我们可以在开始时大跨步下山,后期使用小学习率来精耕细作,我们可以在训练初期采用大学习率,后期采用小学习率。想要达到这个目的有两种策略:人工调整或策略调整。

人工调整策略

​ 一般是根据我们的经验值来调整,通过实践我也发现,在整个神经网络的训练过程种学习率不可能一直是同一个固定的值,初期我会将学习率设置为0.1或0.01以观察训练阶段的train_loss,具体遵循以下准则:

​ ①如果开始时train_loss出现梯度爆炸,说明初始学习率偏大,这样就缩小学习率,再次运行。

​ ②如果开始时train_loss下降缓慢,说明初始学习率偏小,我们可以扩大学习率,再次运行。

​ ③在训练过程中如果发现train_loss下降缓慢或者出现震荡现象,可能进入了局部最小值点或者鞍点附近。若为局部最小值附近,需要降低学习率,精耕细作。如果处于鞍点附近,需要适当增加学习率跳出鞍点。

策略调整学习率

​ 策略调整学习率包括固定策略的学习衰减和自适应学习率衰减。由于学习率的变化,在相似训练数据下训练参数更新速度也会放慢,相当于减小了训练数据对模型训练结果的影响,编程中,我们通常是以epoch为单位衰减学习率。

固定学习率衰减
分段减缓

​ 指定每N轮学习率发生变化(如减半)或者在不同训练阶段设置不同的学习率,便于精细的调参。

分数减缓

​ 将学习率随着epoch的轮数以分数的形式进行衰减,具体公式如下:
α = 1 ( 1 + d e c a y _ r a t e ∗ e p o c h ) ∗ l r \alpha =\frac{1}{\left( 1+decay\_\mathrm{rate}*epoch \right)}*lr α=(1+d

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于MATLAB的多模态分类神经网络代码示例: 首先,加载数据集和必要的工具箱: ```matlab load('multimodal_data.mat'); % 加载数据 addpath(genpath('DeepLearnToolbox')); % 添加深度学习工具箱路径 ``` 然后,将数据集划分为训练集和测试集: ```matlab % 划分数据集 train_ratio = 0.8; % 训练数据比例 num_samples = size(X,1); num_train = round(num_samples*train_ratio); num_test = num_samples - num_train; random_idx = randperm(num_samples); train_idx = random_idx(1:num_train); test_idx = random_idx(num_train+1:end); X_train = X(train_idx,:); Y_train = Y(train_idx,:); X_test = X(test_idx,:); Y_test = Y(test_idx,:); ``` 接下来,定义神经网络的结构和超参数: ```matlab % 定义神经网络结构和超参数 input_size = size(X_train,2); % 输入层大小 hidden_size = 100; % 隐含层大小 output_size = size(Y_train,2); % 输出层大小 learning_rate = 0.1; % 学习率 num_epochs = 100; % 迭代次数 batch_size = 64; % 批大小 ``` 然后,创建神经网络模型: ```matlab % 创建神经网络模型 net = neural_network(input_size, hidden_size, output_size); % 自定义函数 neural_network 返回一个具有指定层数和大小的神经网络模型 ``` 接下来,定义训练函数: ```matlab % 定义训练函数 num_batches = ceil(num_train/batch_size); for epoch = 1:num_epochs for batch = 1:num_batches % 获取当前批次的数据 start_idx = (batch-1)*batch_size + 1; end_idx = min(batch*batch_size, num_train); X_batch = X_train(start_idx:end_idx,:); Y_batch = Y_train(start_idx:end_idx,:); % 前向传播 [loss, grad] = net.loss(X_batch, Y_batch); % 反向传播 net = net.update(learning_rate, grad); end % 打印损失函数值 fprintf('Epoch %d: Loss = %f\n', epoch, loss); end ``` 最后,预测并评估模型: ```matlab % 预测并评估模型 Y_pred_train = net.predict(X_train); Y_pred_test = net.predict(X_test); accuracy_train = sum(all(Y_pred_train == Y_train,2))/num_train; accuracy_test = sum(all(Y_pred_test == Y_test,2))/num_test; fprintf('Train Accuracy: %f\n', accuracy_train); fprintf('Test Accuracy: %f\n', accuracy_test); ``` 完整代码示例如下: ```matlab % 加载数据集和必要的工具箱 load('multimodal_data.mat'); addpath(genpath('DeepLearnToolbox')); % 划分数据集 train_ratio = 0.8; % 训练数据比例 num_samples = size(X,1); num_train = round(num_samples*train_ratio); num_test = num_samples - num_train; random_idx = randperm(num_samples); train_idx = random_idx(1:num_train); test_idx = random_idx(num_train+1:end); X_train = X(train_idx,:); Y_train = Y(train_idx,:); X_test = X(test_idx,:); Y_test = Y(test_idx,:); % 定义神经网络结构和超参数 input_size = size(X_train,2); % 输入层大小 hidden_size = 100; % 隐含层大小 output_size = size(Y_train,2); % 输出层大小 learning_rate = 0.1; % 学习率 num_epochs = 100; % 迭代次数 batch_size = 64; % 批大小 % 创建神经网络模型 net = neural_network(input_size, hidden_size, output_size); % 定义训练函数 num_batches = ceil(num_train/batch_size); for epoch = 1:num_epochs for batch = 1:num_batches % 获取当前批次的数据 start_idx = (batch-1)*batch_size + 1; end_idx = min(batch*batch_size, num_train); X_batch = X_train(start_idx:end_idx,:); Y_batch = Y_train(start_idx:end_idx,:); % 前向传播 [loss, grad] = net.loss(X_batch, Y_batch); % 反向传播 net = net.update(learning_rate, grad); end % 打印损失函数值 fprintf('Epoch %d: Loss = %f\n', epoch, loss); end % 预测并评估模型 Y_pred_train = net.predict(X_train); Y_pred_test = net.predict(X_test); accuracy_train = sum(all(Y_pred_train == Y_train,2))/num_train; accuracy_test = sum(all(Y_pred_test == Y_test,2))/num_test; fprintf('Train Accuracy: %f\n', accuracy_train); fprintf('Test Accuracy: %f\n', accuracy_test); % 自定义函数 neural_network function net = neural_network(input_size, hidden_size, output_size) % 神经网络模型结构 net.input_size = input_size; net.hidden_size = hidden_size; net.output_size = output_size; % 神经网络模型参数 net.W1 = randn(input_size, hidden_size)/sqrt(input_size); net.b1 = zeros(1, hidden_size); net.W2 = randn(hidden_size, output_size)/sqrt(hidden_size); net.b2 = zeros(1, output_size); % 定义前向传播函数 net.forward = @(X)softmax(X*net.W1 + net.b1)*net.W2 + net.b2; % 定义损失函数和梯度函数 net.loss = @loss_function; % 定义更新函数 net.update = @update_function; % 定义预测函数 net.predict = @(X)onehotdecode(net.forward(X)); end % 自定义函数 softmax function Y = softmax(X) Y = exp(X)/sum(exp(X),2); end % 自定义函数 onehotencode function Y = onehotencode(X) [~,Y] = max(X,[],2); Y = bsxfun(@eq, Y, 1:max(Y)); end % 自定义函数 onehotdecode function Y = onehotdecode(X) [~,Y] = max(X,[],2); end % 自定义函数 loss_function function [loss, grad] = loss_function(net, X, Y) % 前向传播 scores = net.forward(X); % 计算损失函数值 softmax_loss = -mean(sum(Y.*log(scores),2)); L2_reg = 0.5*sum(sum(net.W1.^2)) + 0.5*sum(sum(net.W2.^2)); loss = softmax_loss + 0.01*L2_reg; % 计算梯度 delta3 = (scores - Y)/size(X,1); dW2 = net.hidden_output'*delta3 + 0.01*net.W2; db2 = sum(delta3,1); delta2 = delta3*net.W2' .* (1-net.hidden_output.^2); dW1 = X'*delta2 + 0.01*net.W1; db1 = sum(delta2,1); grad.W1 = dW1; grad.b1 = db1; grad.W2 = dW2; grad.b2 = db2; end % 自定义函数 update_function function net = update_function(net, learning_rate, grad) net.W1 = net.W1 - learning_rate*grad.W1; net.b1 = net.b1 - learning_rate*grad.b1; net.W2 = net.W2 - learning_rate*grad.W2; net.b2 = net.b2 - learning_rate*grad.b2; end ``` 请注意,此代码示例仅用于演示多模态分类神经网络的基本结构和实现方法。实际上,为了获得更好的性能,可能需要尝试不同的神经网络结构、超参数和优化算法,并进行适当的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值