在深度学习中,Dropout 是一种正则化技术,通过在训练期间随机屏蔽掉一定比例的神经元来防止过拟合。它通过引入随机性来降低模型对某些特定神经元的依赖,从而提高模型的泛化能力,即在未见过的数据上的表现。
分类: 基础统计
torch的模块
library(torch) # 线性层,输入特征5,输出特征16,常用于神经网络的第一层 l <- nn_linear(in_features = 5, out_features = 16) l l$weight l$bias # 生成一个尺寸为 [50, 5] 的随机张量 x, # 其中包含50个样本,每个样本有5个特征。 # 数据服从标准正态分布。 x <- torch_randn(50, 5) # x 传递给线性层 l,得到输出 output output <- l(x) # 获取并返回输出张量的尺寸,即 [50, 16] output$size() # 用于跟踪生成 output 张量的计算图中的梯度函数。 output$grad_fn # 定义损失函数为output的均值 loss <- output$mean() # loss的反向传播 loss$backward() # 获取线性层 l 的权重参数的梯度。 # 这些梯度用于更新权重, # 以最小化损失函数。 l$weight$grad # 多层感知机,模型是通过 nn_sequential 组合多个神经网络模块构建 mlp <- nn_sequential( nn_linear(10, 32), nn_relu(), nn_linear(32, 64), nn_relu(), nn_linear(64, 1) ) # 调用该模块 mlp(torch_randn(5, 10))
利用自动微分来计算梯度并优化函数
# 加载torch包 library(torch) # 设置常量a和b a <- 1 b <- 5 # rosenbrock函数 rosenbrock <- function(x) { x1 <- x[1] x2 <- x[2] (a - x1)^2 + b * (x2 - x1^2)^2 } # 迭代数2 num_iterations <- 2 # x被初始化为一个值为-1和1的张量k # 并且requires_grad = TRUE表示需要为该张量计算梯度。 x <- torch_tensor(c(-1, 1), requires_grad = TRUE) # optimizer使用optim_lbfgs设置 # 这是L-BFGS优化算法的实现 # line_search_fn参数设置为"strong_wolfe",这是一种线搜索方法 optimizer <- optim_lbfgs(x, line_search_fn = "strong_wolfe") # calc_loss函数用于清零现有的梯度,计算Rosenbrock函数的值 # 显示该值,然后调用backward()来计算梯度。 calc_loss <- function() { optimizer$zero_grad() value <- rosenbrock(x) cat("Value is: ", as.numeric(value), "\n") value$backward() value } # 循环运行指定的迭代次数(num_iterations) # 在每次迭代中,打印迭代次数并调用optimizer$step(calc_loss) # 这会使用L-BFGS算法执行一次优化步骤。 for (i in 1:num_iterations) { cat("\nIteration: ", i, "\n") optimizer$step(calc_loss) }梯度下降法优化 Rosenbrock 函数
a <- 1 b <- 5 rosenbrock <- function(x) { x1 <- x[1] x2 <- x[2] (a - x1)^2 + b * (x2 - x1^2)^2 } num_iterations <- 1000 # 迭代次数为1000 lr <- 0.01 # 学习率(步长)0.01 # 初始化一个张量,初始值为 (-1, 1),并允许计算梯度。 x <- torch_tensor(c(-1, 1), requires_grad = TRUE) for (i in 1:num_iterations) { # 每100次迭代,输出当前的迭代次数。 if (i %% 100 == 0) cat("Iteration: ", i, "\n") value <- rosenbrock(x) # 计算当前 x 处的 Rosenbrock 函数值,并在每100次迭代时输出该值。 if (i %% 100 == 0) { cat("Value is: ", as.numeric(value), "\n") } # 计算函数关于 x 的梯度。 value$backward() if (i %% 100 == 0) { cat("Gradient is: ", as.matrix(x$grad), "\n") } # 使用 with_no_grad 块更新 x 的值:x$sub_(lr * x$grad),即沿梯度的反方向更新 x。 with_no_grad({ x$sub_(lr * x$grad) x$grad$zero_() # x清零,用于下次迭代 }) } x展开/折叠结果
Iteration: 100 Value is: 3.176291e-05 Gradient is: -0.002168588 -0.004486442 Iteration: 200 Value is: 1.453024e-05 Gradient is: -0.001461957 -0.003031492 Iteration: 300 Value is: 6.658438e-06 Gradient is: -0.0009882869 -0.0020504 Iteration: 400 Value is: 3.055203e-06 Gradient is: -0.0006686524 -0.001388192 Iteration: 500 Value is: 1.40284e-06 Gradient is: -0.0004510169 -0.0009411573 Iteration: 600 Value is: 6.444936e-07 Gradient is: -0.0003067786 -0.0006371737 Iteration: 700 Value is: 2.964038e-07 Gradient is: -0.000207768 -0.0004321337 Iteration: 800 Value is: 1.363231e-07 Gradient is: -0.0001404032 -0.0002932549 Iteration: 900 Value is: 6.276184e-08 Gradient is: -9.749157e-05 -0.0001978874 Iteration: 1000 Value is: 2.8892e-08 Gradient is: -6.644445e-05 -0.0001341105 > x torch_tensor 0.9998 0.9997 [ CPUFloatType{2} ][ requires_grad = TRUE ]单因素方差分析与多因素方差分析
# 创建数据框 data <- data.frame( score = c(85, 88, 90, 78, 82, 85, 92, 95, 89), method = factor(c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C')) ) # 执行单因素方差分析 result <- aov(score ~ method, data = data) # 查看结果 summary(result)# 创建数据框 data <- data.frame( score = c(85, 88, 90, 78, 82, 85, 92, 95, 89, 80, 83, 87), method = factor(c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'A', 'B', 'C')), time = factor(c('short', 'short', 'short', 'short', 'short', 'short', 'long', 'long', 'long', 'long', 'long', 'long')) ) # 执行多因素方差分析 result <- aov(score ~ method * time, data = data) # 查看结果 summary(result)在这两个示例中,单因素方差分析用于比较单一因素的影响,而多因素方差分析用于研究多个因素及其交互作用对因变量的影响。
损失函数
损失函数是一个用于衡量模型预测结果与实际目标之间差异的函数。在神经网络中,损失函数的作用是指导模型的训练过程,通过最小化损失函数的值来优化模型的参数。
在回归任务中,常用的损失函数是均方误差(Mean Squared Error, MSE),它计算预测值与真实值之间差异的平方平均值。选择合适的损失函数取决于具体的任务需求。例如,除了均方误差外,有时也可能使用平均绝对误差(Mean Absolute Error)。
y <- torch_randn(5) y_pred <- y + 0.01 loss <- (y_pred - y)$pow(2)$mean()
这个代码片段计算了预测值
y_pred与真实值y之间的均方误差,并将其存储在loss变量中。损失函数的值越小,表示模型的预测越接近真实值。通过不断调整模型的参数以最小化损失函数的值,模型的性能可以得到提升。梯度函数最小化
采用Rosenbrock函数测试优化算法,定义为:
$f(x,y)=(a-x)^2+b(y-x^2)^2$
library(torch) a <- 1 b <- 5 # defining rosenbrock rosenbrock <- function(x) { x1 <- x[1] x2 <- x[2] (a - x1)^2 + b * (x2 - x1^2)^2 } num_iterations <- 1000 # 迭代1000次 1000 iterations lr <- 0.01 # Set the learning rate to 0.01 x <- torch_tensor(c(-1, 1), requires_grad = TRUE) # 初始化一个张量 x,初始值为 (-1, 1),并设置 requires_grad = TRUE 以便计算梯度。 for (i in 1:num_iterations) { if (i %% 100 == 0) cat("Iteration: ", i, "\n") # 每100次迭代输出当前的迭代次数。 value <- rosenbrock(x) #计算Rosenbrock函数在当前 x 值下的函数值。 if (i %% 100 == 0) { # 每100次迭代输出当前的函数值。 cat("Value is: ", as.numeric(value), "\n") } value$backward() # 计算函数值对 x 的梯度。 if (i %% 100 == 0) { # 每100次迭代输出当前的梯度值。 cat("Gradient is: ", as.matrix(x$grad), "\n") } with_no_grad({ # 在不计算梯度的上下文中更新参数 x。 x$sub_(lr * x$grad) # 用梯度下降法更新参数 x,即用学习率乘以梯度的值从 x 中减去。 x$grad$zero_() # 将 x 的梯度清零,以便在下一次迭代中重新计算梯度。 }) }展开/折叠结果
Iteration: 100 Value is: 0.3502924 Gradient is: -0.667685 -0.5771312 Iteration: 200 Value is: 0.07398106 Gradient is: -0.1603189 -0.2532476 Iteration: 300 Value is: 0.02483024 Gradient is: -0.07679074 -0.1373911 Iteration: 400 Value is: 0.009619333 Gradient is: -0.04347242 -0.08254051 Iteration: 500 Value is: 0.003990697 Gradient is: -0.02652063 -0.05206227 Iteration: 600 Value is: 0.001719962 Gradient is: -0.01683905 -0.03373682 Iteration: 700 Value is: 0.0007584976 Gradient is: -0.01095017 -0.02221584 Iteration: 800 Value is: 0.0003393509 Gradient is: -0.007221781 -0.01477957 Iteration: 900 Value is: 0.0001532408 Gradient is: -0.004811743 -0.009894371 Iteration: 1000 Value is: 6.962555e-05 Gradient is: -0.003222887 -0.006653666
经过一千次迭代后,我们达到了一个低于 0.0001 的函数值。此时x的值为:
x
展开/折叠结果
torch_tensor 0.9918 0.9830 [ CPUFloatType{2} ][ requires_grad = TRUE ]当 a=1, b=5时,
$f(x,y)=(1-x)^2+5(y-x^2)^2$
当$x=1$时,$(1-x)^2=(1-1)^2=0$
当$y=x^2=1^2=1$时,$5(y-x^2)^2=5(1-1)^2=0$
因此,函数在1,1时达到最小值0。与x1=0.9918和x2=0.9830极为接近。本例中x和y用x1和x2表示。
张量
在 TensorFlow 和 (Py-)Torch 等深度学习框架中,张量“只是”针对快速计算而优化的多维数组。
事实上,
torch tensor就像一个 Rarray,因为它可以是任意维度的。但与array不同的是,它专为快速且可扩展地执行数学计算而设计,您可以将其移动到 GPU。回归
在统计学和机器学习中,回归分析是一种用于预测和建模的技术,旨在确定目标变量与一个或多个自变量之间的关系。通过回归分析,我们可以预测某些变量的未来值,分析变量之间的因果关系,并发现数据中的趋势和模式。