【机器学习】正则化的基本概念以及正则化成本和梯度的示例

ops/2024/11/15 5:49:41/

引言

机器学习中,正则化(Regularization)是一种技术,用于减少模型复杂度,防止过拟合,并提高模型的泛化能力。通过在损失函数中添加一个额外的惩罚项,正则化鼓励模型学习更简单、更平滑的函数,从而在未见过的数据上表现得更好

文章目录

  • 引言
  • 一、正则化
    • 1.1 正则化的形式
      • 1.1.1 L1 正则化(Lasso 回归)
      • 1.1.2 L2 正则化(Ridge 回归)
      • 1.1.3 Elastic Net 正则化
    • 1.2 正则化的优点
      • 1.2.1 防止过拟合
      • 1.2.1 特征选择
      • 1.2.1 参数稳定性
    • 1.3 正则化的缺点
      • 1.3.1 增加模型复杂度
      • 1.3.2 参数选择
  • 二、正则化成本和梯度
    • 2.1 目标
    • 2.2 添加正则化
    • 2.3带有正则化的成本函数
      • 2.3.1 正则化线性回归的成本函数
    • 2.3 正则化逻辑回归的成本函数
    • 2.4 带有正则化的梯度下降
    • 2.5 带有正则化的梯度计算(线性/逻辑回归
    • 2.6 正则化逻辑回归的梯度函数
    • 2.7 正则化逻辑回归的梯度函数
    • 2.8 重新运行过拟合示例:
    • 2.10 总结

一、正则化

1.1 正则化的形式

1.1.1 L1 正则化(Lasso 回归)

  • 惩罚项: λ ∑ j = 1 n ∣ w j ∣ \lambda \sum_{j=1}^{n} |w_j| λj=1nwj
  • 效果:不仅减少模型复杂度,还能实现特征选择,自动缩小权重

1.1.2 L2 正则化(Ridge 回归)

  • 惩罚项: λ ∑ j = 1 n w j 2 \lambda \sum_{j=1}^{n} w_j^2 λj=1nwj2
  • 效果:减少模型复杂度,但不自动缩小权重

1.1.3 Elastic Net 正则化

  • 惩罚项: λ ( α ∑ j = 1 n ∣ w j ∣ + ( 1 − α ) ∑ j = 1 n w j 2 ) \lambda \left( \alpha \sum_{j=1}^{n} |w_j| + (1 - \alpha) \sum_{j=1}^{n} w_j^2 \right) λ(αj=1nwj+(1α)j=1nwj2)
  • 效果:结合了 L1 和 L2 正则化的优点,可以实现特征选择和减少模型复杂度

1.2 正则化的优点

1.2.1 防止过拟合

通过减少模型复杂度,正则化有助于模型在未见过的数据上表现得更好

1.2.1 特征选择

某些类型的正则化(如 Lasso)可以自动缩小权重,从而实现特征选择

1.2.1 参数稳定性

正则化有助于避免模型对噪声的敏感性,提高参数的稳定性

1.3 正则化的缺点

1.3.1 增加模型复杂度

正则化需要额外的参数(如 lambda),这可能会增加模型的复杂度

1.3.2 参数选择

正则化参数(如 lambda)的选择对模型的性能有很大影响,需要通过交叉验证等方法来确定最佳值

在实际应用中,正则化是一种非常有效的技术,可以显著提高机器学习模型的性能。

二、正则化成本和梯度

2.1 目标

  • 将先前的线性回归和对数几率回归的成本函数扩展一个正则化项
  • 在添加了正则化项后,重新运行之前过拟合的示例
python">import numpy as np
%matplotlib widget
import matplotlib.pyplot as plt
from plt_overfit import overfit_example, output
from lab_utils_common import sigmoid
np.set_printoptions(precision=8)

2.2 添加正则化

在这里插入图片描述

上图展示了线性回归和对数几率回归的成本和梯度函数

注意:

  • 成本:线性回归和对数几率回归的成本函数有显著差异,但向方程中添加正则化的方式是相同的
  • 梯度:线性回归和对数几率回归的梯度函数非常相似。它们仅在实现 𝑓𝑤𝑏 时有所不同

2.3带有正则化的成本函数

2.3.1 正则化线性回归的成本函数

正则化线性回归的成本函数方程为:
J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 + λ 2 m ∑ j = 0 n − 1 w j 2 J(\mathbf{w}, b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) - y^{(i)})^2 + \frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2 J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2+2mλj=0n1wj2
其中:
f w , b ( x ( i ) ) = w ⋅ x ( i ) + b f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) = \mathbf{w} \cdot \mathbf{x}^{(i)} + b fw,b(x(i))=wx(i)+b
与之前实验中实现的没有正则化的成本函数相比,该函数的形式为:
J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 J(\mathbf{w}, b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) - y^{(i)})^2 J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2

  • 不同之处在于正则化项,即 λ 2 m ∑ j = 0 n − 1 w j 2 \frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2 2mλj=0n1wj2

包含这个项可以激励梯度下降最小化参数的大小

注意,在这个例子中,参数 b b b没有被正则化,这是标准做法

下面是方程(1)和(2)的实现,对所有 m 个示例进行 for 循环

python">def compute_cost_linear_reg(X, y, w, b, lambda_ = 1):"""计算所有示例的成本参数:X (ndarray (m,n)):数据,m 个示例,每个示例有 n 个特征y (ndarray (m,)):目标值w (ndarray (n,)):模型参数  b (scalar)       :模型参数lambda_ (scalar) :控制正则化量返回:total_cost (scalar):成本 """m  = X.shape[0]n  = len(w)cost = 0.for i in range(m):f_wb_i = np.dot(X[i], w) + b                                   #(n,)(n,)=scalar, see np.dotcost = cost + (f_wb_i - y[i])**2                               #scalar             cost = cost / (2 * m)                                              #scalar  reg_cost = 0for j in range(n):reg_cost += (w[j]**2)                                          #scalarreg_cost = (lambda_/(2*m)) * reg_cost                              #scalartotal_cost = cost + reg_cost                                       #scalarreturn total_cost                                                  #scalar

运行下面的代码以查看它的效果

python">np.random.seed(1)
X_tmp = np.random.rand(5,6)
y_tmp = np.array([0,1,0,1,0])
w_tmp = np.random.rand(X_tmp.shape[1]).reshape(-1,)-0.5
b_tmp = 0.5
lambda_tmp = 0.7
cost_tmp = compute_cost_linear_reg(X_tmp, y_tmp, w_tmp, b_tmp, lambda_tmp)
print("Regularized cost:", cost_tmp)

输出结果:
在这里插入图片描述
预期输出:
正则化成本: 0.07917239320214275

2.3 正则化逻辑回归的成本函数

对于正则化逻辑回归,成本函数的形式为
J ( w , b ) = 1 m ∑ i = 0 m − 1 [ − y ( i ) log ⁡ ( f w , b ( x ( i ) ) ) − ( 1 − y ( i ) ) log ⁡ ( 1 − f w , b ( x ( i ) ) ) ] + λ 2 m ∑ j = 0 n − 1 w j 2 J(\mathbf{w}, b) = \frac{1}{m} \sum_{i=0}^{m-1} [-y^{(i)} \log(f_{\mathbf{w}, b}(\mathbf{x}^{(i)})) - (1 - y^{(i)}) \log(1 - f_{\mathbf{w}, b}(\mathbf{x}^{(i)}))] + \frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2 J(w,b)=m1i=0m1[y(i)log(fw,b(x(i)))(1y(i))log(1fw,b(x(i)))]+2mλj=0n1wj2
其中:
f w , b ( x ( i ) ) = σ ( w ⋅ x ( i ) + b ) f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) = \sigma(\mathbf{w} \cdot \mathbf{x}^{(i)} + b) fw,b(x(i))=σ(wx(i)+b)
与之前实验中实现的没有正则化的成本函数相比,该函数的形式为:
J ( w , b ) = 1 m ∑ i = 0 m − 1 [ − y ( i ) log ⁡ ( f w , b ( x ( i ) ) ) − ( 1 − y ( i ) ) log ⁡ ( 1 − f w , b ( x ( i ) ) J(\mathbf{w}, b) = \frac{1}{m} \sum_{i=0}^{m-1} [-y^{(i)} \log(f_{\mathbf{w}, b}(\mathbf{x}^{(i)})) - (1 - y^{(i)}) \log(1 - f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) J(w,b)=m1i=0m1[y(i)log(fw,b(x(i)))(1y(i))log(1fw,b(x(i))
正如在线性回归中一样,差异在于正则化项,即 λ 2 m ∑ j = 0 n − 1 w j 2 \frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2 2mλj=0n1wj2
包含这个项可以激励梯度下降最小化参数的大小,注意,在这个例子中,参数 b b b没有被正则化,这是标准做法

python">def compute_cost_logistic_reg(X, y, w, b, lambda_ = 1):"""计算所有示例的成本参数:X (ndarray (m,n): 数据,m 个示例,每个示例有 n 个特征y (ndarray (m,)): 目标值w (ndarray (n,)): 模型参数  b (scalar)      : 模型参数lambda_ (scalar): 控制正则化量返回:total_cost (scalar): 成本 """m,n  = X.shapecost = 0.for i in range(m):z_i = np.dot(X[i], w) + b                                      #(n,)(n,)=scalar, see np.dotf_wb_i = sigmoid(z_i)                                          #scalarcost +=  -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)      #scalarcost = cost/m                                                      #scalarreg_cost = 0for j in range(n):reg_cost += (w[j]**2)                                          #scalarreg_cost = (lambda_/(2*m)) * reg_cost                              #scalartotal_cost = cost + reg_cost                                       #scalarreturn total_cost                                                  #scalar

运行下面的代码以查看它的效果

python">np.random.seed(1)
X_tmp = np.random.rand(5,6)
y_tmp = np.array([0,1,0,1,0])
w_tmp = np.random.rand(X_tmp.shape[1]).reshape(-1,)-0.5
b_tmp = 0.5
lambda_tmp = 0.7
cost_tmp = compute_cost_logistic_reg(X_tmp, y_tmp, w_tmp, b_tmp, lambda_tmp)
print("正则化成本:", cost_tmp)

结果输出:
在这里插入图片描述
预期输出:
正则化成本: 0.6850849138741673

2.4 带有正则化的梯度下降

运行梯度下降的基本算法在正则化后并没有改变,它是:
repeat until convergence: { w j = w j − α ∂ J ( w , b ) ∂ w j for j := 0..n-1 b = b − α ∂ J ( w , b ) ∂ b } \begin{align*} &\text{repeat until convergence:} \; \lbrace \\ & \; \; \;w_j = w_j - \alpha \frac{\partial J(\mathbf{w},b)}{\partial w_j} \tag{1} \; & \text{for j := 0..n-1} \\ & \; \; \; \; \;b = b - \alpha \frac{\partial J(\mathbf{w},b)}{\partial b} \\ &\rbrace \end{align*} repeat until convergence:{wj=wjαwjJ(w,b)b=bαbJ(w,b)}for j := 0..n-1(1)
在每次迭代中,对所有 w j w_j wj 进行同时更新。
正则化后,变化的是计算梯度的方法。

2.5 带有正则化的梯度计算(线性/逻辑回归

对于线性回归和逻辑回归,梯度计算几乎相同,仅在计算 f w , b ( x ) f_{\mathbf{w}, b}(\mathbf{x}) fw,b(x) 时有所不同
∂ J ( w , b ) ∂ w j = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m w j ∂ J ( w , b ) ∂ b = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) \begin{align*} \frac{\partial J(\mathbf{w},b)}{\partial w_j} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\mathbf{w},b}(\mathbf{x}^{(i)}) - y^{(i)})x_{j}^{(i)} + \frac{\lambda}{m} w_j \tag{2} \\ \frac{\partial J(\mathbf{w},b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\mathbf{w},b}(\mathbf{x}^{(i)}) - y^{(i)}) \tag{3} \end{align*} wjJ(w,b)bJ(w,b)=m1i=0m1(fw,b(x(i))y(i))xj(i)+mλwj=m1i=0m1(fw,b(x(i))y(i))(2)(3)
其中:

  • m m m 是数据集中的训练示例数

f w , b ( x ) f_{\mathbf{w}, b}(\mathbf{x}) fw,b(x) 是模型的预测,而 y y y是目标

  • 对于线性回归模型: f w , b ( x ) = w ⋅ x + b f_{\mathbf{w}, b}(\mathbf{x}) = \mathbf{w} \cdot \mathbf{x} + b fw,b(x)=wx+b
  • 对于逻辑回归模型: z = w ⋅ x + b z = \mathbf{w} \cdot \mathbf{x} + b z=wx+b f w , b ( x ) = σ ( z ) f_{\mathbf{w}, b}(\mathbf{x}) = \sigma(z) fw,b(x)=σ(z)
    其中 σ ( z ) \sigma(z) σ(z)sigmoid函数: σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1
    添加正则化的项是 λ m w j \frac{\lambda}{m} w_j mλwj

2.6 正则化逻辑回归的梯度函数

python">def compute_gradient_logistic_reg(X, y, w, b, lambda_): """计算逻辑回归的梯度参数:X (ndarray (m,n): 数据,m 个示例,每个示例有 n 个特征y (ndarray (m,)): 目标值w (ndarray (n,)): 模型参数  b (scalar)      : 模型参数lambda_ (scalar): 控制正则化量返回:dj_dw (ndarray Shape (n,)): 成本相对于参数 w 的梯度。 dj_db (scalar)            : 成本相对于参数 b 的梯度。 """m,n = X.shapedj_dw = np.zeros((n,))                            #(n,)dj_db = 0.0                                       #scalarfor i in range(m):f_wb_i = sigmoid(np.dot(X[i],w) + b)          #(n,)(n,)=scalarerr_i  = f_wb_i  - y[i]                       #scalarfor j in range(n):dj_dw[j] = dj_dw[j] + err_i * X[i,j]      #scalardj_db = dj_db + err_idj_dw = dj_dw/m                                   #(n,)dj_db = dj_db/m                                   #scalarfor j in range(n):dj_dw[j] = dj_dw[j] + (lambda_/m) * w[j]return dj_db, dj_dw  

运行下面的代码以查看它的效果

python">np.random.seed(1)
X_tmp = np.random.rand(5,3)
y_tmp = np.array([0,1,0,1,0])
w_tmp = np.random.rand(X_tmp.shape[1])
b_tmp = 0.5
lambda_tmp = 0.7
dj_db_tmp, dj_dw_tmp =  compute_gradient_logistic_reg(X_tmp, y_tmp, w_tmp, b_tmp, lambda_tmp)
print(f"dj_db: {dj_db_tmp}", )
print(f"Regularized dj_dw:\n {dj_dw_tmp.tolist()}", )

输出结果:
在这里插入图片描述

预期输出

dj_db: 0.6648774569425726
正则化 dj_dw:[0.29653214748822276, 0.4911679625918033, 0.21645877535865857]

2.7 正则化逻辑回归的梯度函数

python">
def compute_gradient_logistic_reg(X, y, w, b, lambda_): """计算线性回归的梯度参数:X (ndarray (m,n)): 数据,m个示例,每个示例有n个特征y (ndarray (m,)): 目标值w (ndarray (n,)): 模型参数  b (标量)        : 模型参数lambda_ (标量) : 控制正则化的程度返回dj_dw (ndarray 形状 (n,)): 成本关于参数w的梯度。dj_db (标量)            : 成本关于参数b的梯度。"""m, n = X.shapedj_dw = np.zeros((n,))                            #(n,)dj_db = 0.0                                       #标量for i in range(m):f_wb_i = sigmoid(np.dot(X[i], w) + b)        #(n,)(n,)=标量err_i = f_wb_i - y[i]                         #标量for j in range(n):dj_dw[j] = dj_dw[j] + err_i * X[i, j]     #标量dj_db = dj_db + err_idj_dw = dj_dw / m                                 #(n,)dj_db = dj_db / m                                 #标量for j in range(n):dj_dw[j] = dj_dw[j] + (lambda_ / m) * w[j]return dj_db, dj_dw

运行以下代码以查看效果

python">np.random.seed(1)
X_tmp = np.random.rand(5, 3)
y_tmp = np.array([0, 1, 0, 1, 0])
w_tmp = np.random.rand(X_tmp.shape[1])
b_tmp = 0.5
lambda_tmp = 0.7
dj_db_tmp, dj_dw_tmp = compute_gradient_logistic_reg(X_tmp, y_tmp, w_tmp, b_tmp, lambda_tmp)
print(f"dj_db: {dj_db_tmp}")
print(f"Regularized dj_dw:\n {dj_dw_tmp.tolist()}")

输出结果:
在这里插入图片描述

预期输出:

dj_db: 0.341798994972791
正则化后的dj_dw:[0.17380012933994293, 0.32007507881566943, 0.10776313396851499]

2.8 重新运行过拟合示例:

python">plt.close("all")
display(output)
ofit = overfit_example(True)

在上面的图表中,尝试对之前的示例使用正则化。特别是:
分类(逻辑回归):

  • 将多项式次数设置为6,正则化参数lambda设置为0(无正则化),拟合数据
    输出结果:
    在这里插入图片描述

  • 现在将lambda设置为1(增加正则化),拟合数据,注意差异
    输出结果:
    在这里插入图片描述

回归(线性回归):

  • 将多项式次数设置为6,正则化参数lambda设置为0(无正则化),拟合数据
    输出结果:
    在这里插入图片描述

  • 现在将lambda设置为1(增加正则化),拟合数据,注意差异
    输出结果:
    在这里插入图片描述

2.10 总结

  • 为线性回归和逻辑回归添加了成本和梯度例程的示例
  • 发展出一些关于正则化如何减少过拟合的直觉

http://www.ppmy.cn/ops/89515.html

相关文章

如何将PyCharm 中使用 PDM 管理的 Django 项目迁移到 VS Code 并确保一切正常工作?

嗨,我是兰若姐姐,相信很多小伙伴都遇到过这种情况,使用pycharm用习惯了,想换个编辑器,比如换成vscode,今天就告诉大家,如果轻松切换到vscode 步骤 1:在 VS Code 中打开项目 打开 V…

【C++标准模版库】list的介绍及使用

list 一.list的介绍二.list的使用1.list 构造函数2.list 空间大小3.list 增删查改4.list 迭代器的使用1.正向迭代器2.反向迭代器 5.list 其他成员函数 三.vector与list关于sort性能的比较 一.list的介绍 C中的list标准模板库(STL)是C标准库中的一个重要组…

数据可视化(王者英雄数据分析)

目 录 第1章 绪 论 1.1 课题背景及研究目的 1.2 课题研究内容 第2章 课题概要及算法原理 2.1 课题概要 2.2 数据说明 2.3 关键技术 第3章 数据分析 3.1 数据统计分析 3.2 可视化分析 3.2.1数据读取及展示 3.2.2数据描述性分析 第4章 数据建模 4.1 数据预处理 4.2…

78.子集

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 &#xff1a;总 // 注释的都为后来思考不必要的 class Solution {List<List<Integer…

电路元件基本知识详解

电路元件基本知识详解 在现代电子技术中&#xff0c;电路元件是构成各种电子电路的基本单元。它们各自具有不同的特性和功能&#xff0c;通过不同的连接方式实现多种多样的电路功能。本文将详细介绍几种常见的电路元件及其基本知识。 ### 一、电阻器 #### 1. 电阻器的基本概…

unity2D游戏开发16弹弓动画

清理动画器 选中PlayerObject,打开Animator,删除原来的四个状态 右键选择Create State |from New Blend Tree; 冲命名为Walk Tree 双击Walk Tree查看Blend Tree Graph 设置属性为2D Simple Directional,再点击加号选择Add Motion Field 添加四个,如图 点击Base Layer

el-table 表格序号列前端实现递增,切换分页不从头开始

<el-table-column type"index" width"55" label"序号" :index"hIndex"> </el-table-column> 分页 <el-pagination size-change"handleSizeChange" current-change"handleCurrentChange"> <…

【前端面试】七、算法-Math、数组、数据结构等

目录 1.Math 2.数组 3.常见数据结构 4.设计模式 1.Math Math.abs:求绝对值&#xff1b;Math.sign:判断正负&#xff0c;求数值符号Math.ceil:向上取整&#xff1b; Math.floor:向下取整&#xff1b; Math.round:四舍五入Math.max:求最大值&#xff1b;Math.min:求最小值Ma…