分类: 基础统计

  • Dropout

    在深度学习中,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就像一个 R array,因为它可以是任意维度的。但与array不同的是,它专为快速且可扩展地执行数学计算而设计,您可以将其移动到 GPU。

  • 回归

    在统计学和机器学习中,回归分析是一种用于预测和建模的技术,旨在确定目标变量与一个或多个自变量之间的关系。通过回归分析,我们可以预测某些变量的未来值,分析变量之间的因果关系,并发现数据中的趋势和模式。