如何在Gradient Descent(梯度下降)过程中展示误差的演化情况?
梯度下降过程中误差演化的记录与展示
要在梯度下降过程中展示误差的变化,核心是记录每一步的损失值,之后通过绘图工具可视化即可。以下是针对你的R语言PyTorch代码的修改方案:
方案1:记录每个batch的损失(细致观察波动)
直接在每个batch计算损失后,将损失值存入历史列表,最后绘制完整的迭代损失曲线:
x <- df_tensor[,4,drop=FALSE] y <- df_tensor[,1,drop=FALSE] my_model <- nn_linear(1,1) ds <- tensor_dataset(x, y) dl <- dataloader(ds) optimiser <- optim_sgd(my_model$parameters, lr = 0.01) loss <- nnf_mse_loss # 初始化损失历史容器 loss_history <- c() for (e in 1:10) { coro::loop(for (b in dl) { y_pred <- my_model(b[[1]]) c_loss <- loss(y_pred, b[[2]]) # 将当前batch的损失值转为R数值并存入历史 loss_history <- c(loss_history, as.numeric(c_loss)) optimiser$zero_grad() c_loss$backward() optimiser$step() }) } # 绘制损失演化曲线 plot(loss_history, type = "l", xlab = "迭代步数", ylab = "MSE损失", main = "梯度下降过程中损失变化")
方案2:记录每个epoch的平均损失(观察整体趋势)
如果想更清晰地看每一轮训练的整体损失变化,可以计算每个epoch的平均损失,曲线会更平滑:
x <- df_tensor[,4,drop=FALSE] y <- df_tensor[,1,drop=FALSE] my_model <- nn_linear(1,1) ds <- tensor_dataset(x, y) dl <- dataloader(ds) optimiser <- optim_sgd(my_model$parameters, lr = 0.01) loss <- nnf_mse_loss # 初始化epoch级损失历史容器 epoch_loss_history <- c() for (e in 1:10) { total_loss <- 0 batch_num <- 0 coro::loop(for (b in dl) { y_pred <- my_model(b[[1]]) c_loss <- loss(y_pred, b[[2]]) total_loss <- total_loss + as.numeric(c_loss) batch_num <- batch_num + 1 optimiser$zero_grad() c_loss$backward() optimiser$step() }) # 计算当前epoch的平均损失并记录 avg_loss <- total_loss / batch_num epoch_loss_history <- c(epoch_loss_history, avg_loss) # 控制台打印每轮损失 cat(sprintf("第%d轮训练,平均损失:%.4f\n", e, avg_loss)) } # 绘制epoch级损失曲线 plot(1:10, epoch_loss_history, type = "l", xlab = "训练轮次(Epoch)", ylab = "平均MSE损失", main = "每轮训练平均损失变化")
可选:用ggplot2美化曲线
如果需要更美观的可视化效果,可以使用ggplot2包:
library(ggplot2) # 针对batch级损失 loss_df <- data.frame( step = 1:length(loss_history), loss = loss_history ) ggplot(loss_df, aes(x = step, y = loss)) + geom_line(color = "#2E86AB") + labs(x = "迭代步数", y = "MSE损失", title = "梯度下降过程中损失演化") + theme_minimal() # 针对epoch级损失 epoch_loss_df <- data.frame( epoch = 1:10, avg_loss = epoch_loss_history ) ggplot(epoch_loss_df, aes(x = epoch, y = avg_loss)) + geom_line(color = "#D81E5B") + labs(x = "训练轮次(Epoch)", y = "平均MSE损失", title = "每轮训练平均损失演化") + theme_minimal()
内容的提问来源于stack exchange,提问作者Gaspard_Boyer
相关产品推荐
相关产品推荐

