机器学习7-全连接神经网络3-过拟合与超参数

news/2025/2/6 23:41:51/

机器学习7-全连接神经网络3-过拟合欠拟合

  • 过拟合
    • 应对过拟合-最优方案:获取更多的训练数据
    • 应对过拟合-次优方案:正则化
    • 应对过拟合-次优方案2:随机失活
    • 综合考量
  • 超参数
    • 超参数优化方法

过拟合

在这里插入图片描述

  • 机器学习的根本问题是优化和泛化的问题。
  • 优化——是指调节模型以在训练数据上得到最佳性能;
  • 泛化------指训练好的模型在前所未见的数据上的性能好坏。
    训练初期:
    优化和泛化是相关的:训练集上的误差越小,验证集上的误差也越小,集上的误差也越小,模型的泛化能力逐渐增强

训练后期:
模型在验证集上的错误率不再降低,转而开始变高。模型出现过拟合,开始学习仅和训练数据有关的模式。

最优方案——获取更多的训练数据
次优方案——调节模型允许存储的信息量或者对模型允许存储的信息加以
约束,该类方法也称为正则化

机器学习和数据科学领域,提高模型性能通常涉及多种策略。你提到的两种方案——获取更多的训练数据和正则化——是实践中非常常见且有效的方法。下面将详细解释这两种方案,并探讨它们在不同情境下的适用性。

应对过拟合-最优方案:获取更多的训练数据

原理
更多的训练数据意味着模型可以学习到更多关于数据分布的特征,从而提高泛化能力。大数据集有助于减少过拟合的风险,因为模型有更多的机会学习到数据中的真实模式,而不是噪声。

优点

  • 提高模型的泛化能力。
  • 减少过拟合的风险。
  • 在一些情况下,可以简化模型设计,因为大数据集本身就能提供足够的信息来支持复杂问题的解决。

挑战

  • 数据收集可能耗时、耗力且昂贵。
  • 数据质量和标签的准确性需要保证。
  • 数据存储和处理能力可能受到限制。

应对过拟合-次优方案:正则化

在这里插入图片描述

原理
正则化是通过在损失函数中添加一个惩罚项来约束模型的复杂度,从而防止模型在训练数据上过拟合。正则化方法包括L1正则化(Lasso)、L2正则化(Ridge) 等。L21正贝损失对于大数值的权值向量进行严厉惩罚,鼓励更加分散的权重向量;使模型倾向于使用所有输入特征做决策,此时的模型泛化性能好!

应对过拟合-次优方案2:随机失活

  • 随机失活:让隐层的神经元以一定的概率不被激活。
  • 实现方式:训练过程中,对某一层使用Dropout,就是随机将该层的一些输出舍弃(输出值设置为0),这些被舍弃的神经元就好像被网络删除了一样。
  • 随机失活比率( Dropout ratio) :是被设为0的特征所占的比例,通常在0.2——0.5范围内。

例:假设某一层对给定输入样本的返回值应该是向量:[0.2,0.5,1.3,0.8,1.1]。,
使用Dropout后,这个向量会有几个随机的元素变成:[0,0.5,1.3, 0, 1.1]。

随机失活为什么能够防止过拟合呢?
在这里插入图片描述

随机失活的应用
在这里插入图片描述

测试阶段与训练阶段的输出值不一致

import numpy as np# 神经元保持激活状态的概率,该值越高失活的单元就越少
P = 0.5# 定义训练函数
def train(x, W1, b1, W2, b2, W3, b3):# 计算第一层输出H1 = np.maximum(0, np.dot(W1, x) + b1)# 生成第一层的maskU1 = (np.random.rand(*H1.shape) < P).astype(float)# 第一层dropout操作H1 *= U1# 计算第二层输出H2 = np.maximum(0, np.dot(W2, H1) + b2)# 生成第二层的maskU2 = (np.random.rand(*H2.shape) < P).astype(float)# 第二层dropout操作H2 *= U2# 计算输出层输出out = np.dot(W3, H2) + b3return out, H1, H2  # 可以根据需要返回中间层输出用于调试或可视化# 定义预测函数
def predict(x, W1, b1, W2, b2, W3, b3):# 注意:在预测时通常不使用dropout,但为了与train函数保持一致,这里仍保留权重和偏置的变量名H1 = np.maximum(0, np.dot(W1, x) + b1) * PH2 = np.maximum(0, np.dot(W2, H1) + b2) * Pout = np.dot(W3, H2) + b3return out# 初始化权重和偏置
input_size = 3
hidden_size1 = 4
hidden_size2 = 4
output_size = 1W1 = np.random.randn(hidden_size1, input_size) * 0.01
b1 = np.zeros((hidden_size1, 1))
W2 = np.random.randn(hidden_size2, hidden_size1) * 0.01
b2 = np.zeros((hidden_size2, 1))
W3 = np.random.randn(output_size, hidden_size2) * 0.01
b3 = np.zeros((output_size, 1))# 示例输入
x = np.random.rand(input_size, 1)  # 假设输入是一个三维向量# 训练并获取输出
output, H1_val, H2_val = train(x, W1, b1, W2, b2, W3, b3)
print("Training Output:", output)# 预测
prediction = predict(x, W1, b1, W2, b2, W3, b3)
print("Prediction:", prediction)

在训练阶段直接除以概率P,测试阶段不用除以概率P。

综合考量

优点

  • 在不增加额外数据的情况下,提高模型的泛化能力。
  • 通过控制模型的复杂度,有助于减少过拟合。
  • 可以作为模型训练过程中的一个调整参数,灵活应用于不同的模型架构。

挑战

  • 需要仔细调整正则化参数以找到最佳平衡点,这可能需要多次实验。

  • 正则化可能会限制模型的性能,尤其是在数据量充足且模型复杂度适当的情况下。

  • 对于某些类型的模型(如深度学习模型),正则化的效果可能不如增加数据量显著。

  • 数据量不足:在数据量严重不足的情况下,获取更多数据通常是首选方案。如果数据收集不可行或成本过高,正则化可以作为一个有效的替代方案。

  • 模型复杂度过高:当模型复杂度过高且数据量相对不足时,正则化尤为重要。通过约束模型的复杂度,可以减少过拟合的风险。

  • 计算资源限制:在处理大规模数据集时,计算资源的限制可能成为一个问题。在这种情况下,正则化可以作为一种减轻计算负担的策略,同时保持模型的性能。

总之,获取更多的训练数据和正则化是提高模型性能的两种有效策略。在实际应用中,应根据具体情境和数据特点灵活选择和应用这两种方法。

超参数

  • 网络结构——隐层神经元个数,网络层数,非线性单元选择等
  • 优化相关———学习率、dropout比率、正则项强度等

在这里插入图片描述

  • 学习率过大,训练过程无法收敛
  • 学习率偏大,在最小值附近震荡,达不到最优
  • 学习率太小,收敛时间较长
  • 学习率适中,收敛快、结果好

超参数优化方法

  • 网格搜索法:
    1.每个超参数分别取几个值,组合这些超参数值,形成多组超参数;
    2.在验证集上评估每组超参数的模型性能;
    3.选择性能最优的模型所采用的那组值作为最终的超参数的值。

  • 随机搜索法
    1.参数空间内随机取点,每个点对应一组超参数;
    2.在验证集上评估每组超参数的模型性能;
    3.选择性能最优的模型所采用的那组值作为最终的超参数的值。

在这里插入图片描述
在这里插入图片描述

  • 粗搜索:利用随机法在较大范围里采样超参数训练一个周期,依据验证集正确率缩小超参数范围。
  • 精搜索:利用随机法在前述缩小的范围内采样超参数;运行模型五到十个周期,选择验证集上精度最高的那组超参数。

http://www.ppmy.cn/news/1569932.html

相关文章

RabbitMQ深度探索:简单实现 MQ

基于多线程队列实现 MQ &#xff1a; 实现类&#xff1a; public class ThreadMQ {private static LinkedBlockingDeque<JSONObject> broker new LinkedBlockingDeque<JSONObject>();public static void main(String[] args) {//创建生产者线程Thread producer n…

Python从0到100(八十七):CNN网络详细介绍及WISDM数据集模型仿真

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

Chromium132 编译指南 - Android 篇(四):配置 depot_tools

1. 引言 在前面的章节中&#xff0c;我们详细介绍了编译 Chromium 132 for Android 所需的系统和硬件要求&#xff0c;以及如何安装和配置基础开发环境和常用工具。完成这些步骤后&#xff0c;接下来需要配置 depot_tools&#xff0c;这是编译 Chromium 的关键工具集。depot_t…

【PromptCoder + Bolt.new】Cascade模式自动生成页面和对应的路由

【PromptCoder Bolt.new】Cascade模式自动生成页面和对应的路由 官网&#xff1a;PromptCoder PromptCoder&#xff1a;智能代码提示词生成 PromptCoder是一款利用人工智能技术的智能代码生成工具。它能够识别设计图或截图&#xff0c;并自动生成与之匹配的前端代码。无论是…

七。自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

import tensorflow as tf import numpy as np # 自定义数据集类 class CustomDataset(tf.data.Dataset): def __init__(self, x_data, y_data): self.x_data tf.convert_to_tensor(x_data, dtypetf.float32) self.y_data tf.convert_to_tensor(y_data, …

在Vue3 + Vite 项目中使用 Tailwind CSS 4.0

文章目录 首先是我的package.json根据官网步骤VS Code安装插件验证是否引入成功参考资料 首先是我的package.json {"name": "aplumweb","private": true,"version": "0.0.0","type": "module","s…

二叉树--链式存储

1我们之前学了二叉树的顺序存储&#xff08;这种顺序存储的二叉树被称为堆&#xff09;&#xff0c;我们今天来学习一下二叉树的链式存储&#xff1a; 我们使用链表来表示一颗二叉树&#xff1a; ⽤链表来表⽰⼀棵⼆叉树&#xff0c;即⽤链来指⽰元素的逻辑关系。通常的⽅法是…

Python安居客二手小区数据爬取(2025年)

目录 2025年安居客二手小区数据爬取观察目标网页观察详情页数据准备工作&#xff1a;安装装备就像打游戏代码详解&#xff1a;每行代码都是你的小兵完整代码大放送爬取结果 2025年安居客二手小区数据爬取 这段时间需要爬取安居客二手小区数据&#xff0c;看了一下相关教程基本…