深度剖析L1与L2正则化:机器学习的关键策略
最近写了太多热点的模型和方法,感觉飘在天上一样,还是想脚踏实地写一些基础理论。看了一些大佬的文章,发现一些不错的内容,特此总结分享。感谢阅读,水平有限~
📖阅读时长:50分钟
🕙发布时间:2025-02-05
近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企】
公众号【柏企科技说】【柏企阅文】
在机器学习不断突破极限的征程中,过拟合问题如影随形,成为众多数据科学家亟待攻克的难关。想象一下,你精心训练的模型在训练数据上表现堪称完美,可一旦应用到现实场景,却如同折翼的飞鸟,表现一落千丈。这便是过拟合在作祟——模型过度学习了数据中的噪声,却忽略了真正重要的模式。而正则化的出现,恰似一位经验丰富的引路人,引领模型走出过拟合的泥沼,让它能够精准捕捉关键信号,而不是机械记忆数据点。
对于经验丰富的数据科学家而言,微调正则化意义非凡,它可不只是为了规避过拟合,更能深度挖掘模型的最大潜能,提升模型性能,增强模型的可解释性。正则化就像一把神奇的钥匙,能让模型在各种复杂数据环境中都游刃有余,无论是理想条件下的数据,还是杂乱无章的现实数据,都能轻松应对。无论你是在微调深度神经网络,还是在优化传统模型,正则化都能让优秀的模型更上一层楼。
一、常见挑战:欠拟合与过拟合的博弈
在机器学习的领域中,欠拟合和过拟合就像两条危险的边界,我们需要小心翼翼地在中间寻找平衡。欠拟合发生时,模型过于简单,就好比用黑白两色去描绘莫奈那色彩斑斓的画作,丢失了画作丰富的细节和深度;而过拟合则像是过度解读画作,执着于每一笔的细节,却忽略了画作整体的意境。
正则化在此时发挥着关键作用,它就像一个精准的调节器,帮助我们把控模型的复杂度,在简单与复杂之间找到那个微妙的平衡点,让模型既能捕捉到数据的关键特征,又不会被过多的细节干扰,始终聚焦于核心要点。
二、L1和L2正则化的理论基石
(一)为什么正则化对复杂模型至关重要
随着模型复杂度的飙升,尤其是深度学习模型拥有数百万个参数,过拟合的风险也呈指数级增长。想象一下,在一个包含数千个特征的数据集上训练深度神经网络,如果缺少正则化的约束,模型就如同脱缰的野马,会不加区分地记住所有细节,甚至包括那些随机噪声。这样的模型在训练数据上看似表现出色,但面对全新的数据时,却毫无用武之地。
正则化并非只是大规模神经网络的专属,即使是像逻辑回归、线性回归这样相对简单的模型,也能从中受益。模型的灵活性越高,就越容易陷入过拟合的陷阱,此时就需要正则化这根“缰绳”,约束模型,帮助它在追求准确性的同时,兼顾泛化能力。
(二)正则化背后的数学奥秘
正则化的神奇魔力源自其数学原理。当谈及L1和L2正则化时,核心在于为模型的损失函数添加惩罚项。这个惩罚项就像是给模型设定的“规则”,防止它对某些特定的权重组合过度依赖,避免模型过于“偏爱”某些特征。
- L1正则化(Lasso)
L1正则化的惩罚项简洁而强大,它将模型权重的绝对值累加到损失函数中。在实际应用中,随着惩罚系数λ的增大,惩罚力度增强,会迫使模型将那些不太重要的特征权重压缩至零。这就好比一场“精简风暴”,只有对模型贡献最大的“关键选手”才能留下来,使得模型具有稀疏性,实现特征选择的效果。
以生物信息学中的基因表达数据集为例,数据集中可能包含数千个基因特征,但真正对研究结果有贡献的可能寥寥无几。L1正则化就像一把精准的手术刀,能够筛选出最重要的基因,将复杂的模型简化为高效的预测工具。
- L2正则化(Ridge)
与L1正则化不同,L2正则化采用了另一种惩罚方式。它同样会惩罚较大的权重,但不会让权重完全归零,而是抑制权重值变得过大,确保所有特征都能在模型中发挥作用,只是根据其重要性调整影响力。可以说,L2正则化是一位“平衡大师”,避免任何一个特征在模型中占据主导地位。
当处理数据集中特征的多重共线性问题时,L2正则化效果显著。例如在预测房价的数据集里,房屋面积、房间数量和土地面积等特征往往相互关联。L2正则化能够在保留所有特征信息的同时,合理降低相关特征的影响,让模型的预测更加稳定可靠。
- 主要区别
L1正则化鼓励模型权重的稀疏性,适合用于简化含有大量无关特征的模型;L2正则化则更擅长均匀分散权重,在每个特征都很重要,且要防止单个特征主导预测结果的场景中表现出色。
(三)对损失函数的影响:添加正则化项
- 正则化如何重塑损失函数
在机器学习中,我们熟悉的均方误差(MSE)用于回归任务,交叉熵用于分类任务,这些基本损失函数可以衡量模型预测与实际标签之间的差距,但它们没有考虑控制模型复杂度的因素。正则化的介入填补了这一空白。
当应用L1或L2正则化时,就相当于给模型下达了新的指令:不仅要关注数据拟合的效果,还要控制模型权重的大小。通过在损失函数中添加惩罚项,实现对模型的“双重约束”。
- 具体形式
对于L1正则化,修改后的损失函数为:
对于L2正则化,损失函数则变为:
这些惩罚项的存在,实际上增加了模型使用大权重的“成本”。在训练过程中,模型不再仅仅追求最小化预测误差,还需要权衡权重的大小,从而避免过度复杂的解决方案,提升对未知数据的泛化能力。
以逻辑回归中的交叉熵损失函数为例,加入L2正则化后,损失函数变为:
这意味着模型如果过度依赖某个特定特征,就会受到惩罚,从而有效降低过拟合的风险。
(四)带正则化的梯度下降
梯度下降是模型训练的核心算法,L1和L2正则化在其中扮演着独特的角色,深刻影响着模型权重的更新过程。
- L2正则化(Ridge)
使用L2正则化时,梯度更新规则为:
从公式可以看出,L2正则化会推动权重向更小的方向更新,但不会让权重变为零,这种“软约束”保证了所有特征在模型中都能持续发挥作用。
- L1正则化(Lasso)
L1正则化的梯度更新由于惩罚项中的绝对值而有所不同,其公式为:
L1正则化具有“硬阈值”特性,在梯度下降过程中,会强制部分权重变为零,实现特征选择,使模型变得稀疏。
- 对比总结
L2正则化使权重更新更加平滑,所有特征都能在一定程度上参与模型训练;L1正则化则直接将部分权重归零,打造稀疏模型,二者各有千秋,适用于不同的场景。
三、详细比较:L1与L2正则化
(一)权重的行为差异
在L1正则化的作用下,模型权重如同经历了一场“断舍离”。它对无关权重零容忍,一旦某个特征对模型贡献不大,其权重就会被推向零,最终得到一个简洁的稀疏模型,便于理解和解释。
而L2正则化则更为温和,它不会让权重归零,而是通过“温柔的推动”,使所有权重都保持在较小的非零值,确保每个特征都能在模型中发挥作用,尤其适用于需要保留所有特征信息,但又要控制特征影响力的场景。
(二)何时使用L1与L2
使用L1正则化的场景
- 当你怀疑数据集中只有少数特征真正重要,存在稀疏性时,L1正则化能精准筛选出关键特征。
- 若希望在模型训练过程中自动实现特征选择,L1正则化会将不重要的特征权重归零,简化模型结构。
- 在处理高维数据集,如文本数据或生物信息学数据时,面对大量可能无关或冗余的特征,L1正则化就像一位高效的“特征工程师”,帮助模型聚焦关键信息。
使用L2正则化的场景
- 当数据集中存在多重共线性,即特征之间高度相关时,L2正则化能巧妙地收缩相关特征的系数,而不完全删除它们,这对于线性模型,如岭回归非常适用。
- 若想保留所有特征,但又要防止单个特征主导预测结果,L2正则化能均衡各特征的影响力。
- 在神经网络或深度学习模型中,L2正则化(常称为权重衰减)能有效防止模型对噪声过于敏感,对于大规模模型的稳定训练至关重要。
(三)混合方法:ElasticNet
如果你既想享受L1正则化强大的特征选择能力,又不想放弃L2正则化的平滑正则化效果,那么ElasticNet就是你的理想之选。它创新性地将L1和L2正则化的惩罚项结合起来,融入损失函数:
这种独特的设计使ElasticNet兼具两者优势,在面对复杂数据集,难以抉择L1和L2时,或者特征选择与权重正则化都极为关键的场景中,它能发挥出巨大的价值。
以遗传数据分析为例,面对数千个基因特征,既希望筛选出关键基因,又不想过度丢弃信息,ElasticNet就能通过调整权重,将部分不重要的权重缩小为零,同时对其他权重进行合理收缩,实现精准分析。
四、实现正则化的实际考量
(一)超参数调优之λ的选择
在正则化的实际应用中,调整正则化强度参数λ是关键步骤。λ就像是调节正则化力度的“旋钮”,它的大小直接影响模型的性能。
当λ较小时,模型会更注重最小化损失,努力拟合数据,但这也可能导致模型过度学习数据中的噪声,引发过拟合风险;而当λ过大时,模型会受到过度约束,变得过于僵化,无法充分学习数据中的有效信息,进而出现欠拟合问题。
那么,如何找到这个平衡偏差和方差的最佳λ值呢?超参数调优技术应运而生。我们可以借助网格搜索、随机搜索等方法,遍历不同的λ值,评估模型性能,从而确定最优设置。此外,贝叶斯优化也是一种高效的方法,它能够智能地在超参数空间中搜索,往往能更快地找到理想的λ值。
(二)交叉验证技术
交叉验证是调整正则化参数时不可或缺的得力助手。k折交叉验证是常见的方法,它将数据集划分为k个子集,模型在k - 1个子集上进行训练,剩余的一个子集用于验证。这个过程重复k次,最后对性能指标求平均值,以此获得模型在未知数据上的可靠性能评估。
对于不平衡数据集,如类别分布不均衡的分类问题,分层k折交叉验证更为适用。它能确保每个子集的类别分布相似,使验证结果更加稳定可靠。
交叉验证之所以重要,是因为正则化对不同模型的影响存在差异。在高维数据中,L1正则化可能在某一折数据中筛选出不同的特征,而交叉验证能够全面评估正则化策略的有效性,确保其不是偶然的结果,而是真正能提升模型性能的可靠方法。
(三)对模型性能的影响
正则化对模型性能指标的影响并非简单直接,它需要在性能和泛化能力之间寻求平衡。
- L1正则化
L1正则化有助于生成更简单、可解释性强的模型,尤其在处理高维数据时效果显著。然而,如果对某些相关特征惩罚过重,可能会略微降低模型的准确率。但从长远来看,它能提升模型的泛化能力,使模型在实际应用中表现更出色。 - L2正则化
L2正则化擅长避免极端权重,在不牺牲特征的前提下防止过拟合。它通常能提升模型的稳定性和泛化能力,这在AUC(曲线下面积)和精度 - 召回率曲线等指标上有明显体现。
在实际操作中,我们可能会发现,随着λ的增大,模型在验证集上的性能因过拟合的减少而提升,但训练准确率可能会有所下降。这是一种正常的权衡,模型在训练性能上的“舍”,换来了在现实世界中更好的泛化能力。
五、L1和L2正则化的实际应用
(一)L1正则化的应用场景
在特征选择至关重要的领域,L1正则化大显身手。在生物信息学研究基因表达数据时,面对数千个基因特征,只有少数与疾病或研究的状况相关。L1正则化能精准定位这些关键基因,去除噪声干扰,为研究提供有力支持。
在文本数据处理中,L1正则化同样表现出色。以文本分类模型为例,大量的单词构成了高维特征空间,但很多单词与分类任务并无关联。L1正则化通过将无关单词的系数缩小至零,精简模型,使模型更易于解释和计算。
(二)L2正则化的应用场景
当处理多重共线性问题时,L2正则化是不二之选。在预测房价的场景中,房屋面积、房间数量和房产大小等特征相互关联,L2正则化能够合理调整这些相关特征的系数,确保每个特征都能适度贡献,避免某个特征主导预测结果。
在金融建模领域,L2正则化也发挥着重要作用。金融数据集中的预测指标往往相互关联,如股票市场指标。使用L2正则化可以保留所有特征信息,同时降低单一指标的过度影响,使模型更加稳健,避免过度拟合个别强预测指标。
(三)示例比较
假设正在构建一个电商平台的推荐系统,拥有大量与用户行为相关的特征,如点击次数、停留时间、购买记录等。
若采用L1正则化,模型可能只选择少数关键特征,如购买和点击行为,丢弃其他特征。这样的模型解释性强、计算速度快,但可能会丢失一些细微的用户行为信息。
若使用L2正则化,所有特征都能参与模型训练,但各自的影响力会被合理缩放,不会出现某个特征主导推荐结果的情况。虽然模型相对复杂,但更加平衡,能够综合考虑多种因素进行推荐。
六、 不同机器学习算法中的正则化
在机器学习的领域中,正则化就像一个万能钥匙,适配于各种不同的算法,助力提升模型性能、增强泛化能力。接下来,让我们深入探究正则化在不同机器学习算法中的具体应用。
线性模型:Lasso和Ridge回归
深入线性模型的世界,正则化在提升模型性能与可解释性方面扮演着关键角色。其中,Lasso(L1)回归和Ridge(L2)回归是处理不同复杂数据集的有力武器。
Lasso(L1正则化)
想象一下,你正在处理一个高维数据集,特征数量远远超过观测数量,比如在遗传学研究或文本分类场景中。这种情况下,Lasso回归的优势就凸显出来了。它能将无关特征的系数缩小至零,从而实现特征选择,就像是回归模型内置的特征筛选器。比如说,面对一个含有数千个预测变量的数据集,Lasso回归可以精准找出少数真正重要的变量,让模型既易于解释,又能有效避免过拟合。
Ridge(L2正则化)
与之相对,Ridge回归在处理特征相关的数据集时表现出色。当数据集中存在多重共线性问题,例如在预测房价时,房间数量、房屋面积和地块大小等因素相互关联,Ridge回归就能确保所有特征都能发挥作用,同时避免某个特征占据主导地位,就好像让合唱团里的每个声音都能和谐发声,而不是被某一个歌手抢了风头。举个简单例子,当你依据社交媒体支出、广告活动、促销等相互关联的营销特征来预测销售数据时,Ridge回归会平衡地收缩这些特征的系数,提升模型的稳定性。
逻辑回归:二元分类中的L1和L2正则化
现在,我们来探讨逻辑回归,特别是在二元分类任务中的应用。不管是进行客户流失分类、欺诈检测,还是垃圾邮件筛选,L1和L2正则化都能对模型的泛化能力进行优化。
逻辑回归中的L1正则化
如果你处理的是稀疏数据集,例如文本数据,其中只有少数特征有意义,那么L1正则化可以通过将无关系数归零来简化模型。这不仅提升了模型的可解释性,还能减少计算时间,对于需要快速实时预测的场景,如垃圾邮件检测系统来说,非常实用。
逻辑回归中的L2正则化
要是你的二元分类任务涉及高度相关的特征,L2正则化就能派上用场了。它通过平滑较大的系数,防止某个特征主导决策边界。以欺诈检测系统为例,其中包含交易金额、地点、时间等多个欺诈指标,L2正则化能确保这些因素均匀地发挥作用,构建出更平衡的模型。
神经网络:L2正则化(权重衰减)的作用
在神经网络领域,尤其是深度学习中,L2正则化通常被称为权重衰减。随着神经网络深度的增加,过拟合的风险呈指数级上升,这时L2正则化就发挥作用了。
L2正则化会抑制较大的权重值,有助于防止过拟合,在处理噪声数据或复杂模型时效果显著。比如,在训练用于图像分类的深度神经网络时,L2正则化能确保模型不会过度依赖某一个特征(如边缘检测),而是综合考虑图像中的各种模式。
虽然L1在神经网络中的应用不如L2广泛,但在需要稀疏表示的场景中仍然有用。例如在自动编码器或稀疏编码中,L1正则化可以使网络一次仅激活少数神经元,让隐藏层更具可解释性。
基于树的方法:梯度提升中的正则化
对于基于树的模型,L1和L2正则化不像在线性模型或神经网络中那么常见。不过,像XGBoost这样的框架已经将正则化集成到梯度提升中。在XGBoost里,你可以运用L1和L2正则化来控制每棵树的复杂度,防止模型对单个数据点过于敏感,也就是避免过拟合。
比如说,当你使用XGBoost预测贷款违约可能性时,L1正则化可用来挑选最重要的特征,而L2正则化能确保模型不会过度依赖某一个决策树,进而得到一个更具泛化能力的集成模型。
深度学习模型中的正则化
Dropout与L2正则化
在深度学习中,Dropout和L2正则化哪个更好,是大家经常讨论的话题。下面我们来详细分析一下。
L2正则化(权重衰减)
深度学习中的L2正则化和传统模型中的作用一样,都是抑制较大的权重值,降低过拟合风险。但深度学习网络参数众多,L2正则化虽然能平滑权重,有时却不足以完全解决问题。
Dropout
你可能想不到,Dropout是通过在训练过程中随机关闭神经元来实现正则化的。每次前向传递时,Dropout会随机丢弃一部分神经元,这样网络就不会过度依赖某一个神经元或模式,就像是让每个神经元都学会独立发挥作用,因为它们不能指望训练时相邻神经元一直处于激活状态。
那么,应该用Dropout取代L2正则化吗?不一定。实际上,这两种技术可以相辅相成。Dropout减少神经元之间的协同适应,L2正则化则确保没有神经元占据主导地位。在实践中,同时使用这两种方法,在图像或语音识别等任务中,能显著降低深度模型的过拟合现象。
批量归一化与正则化
你或许会问:“批量归一化又是什么情况呢?”其实,批量归一化通常可以看作是一种隐式的正则化方式。它通过对每一层的激活值进行归一化,稳定学习过程,减少内部协变量偏移,在一定程度上还能防止过拟合。从本质上讲,批量归一化优化了模型的学习环境,让模型更容易收敛。
不过要注意,批量归一化虽然有正则化的效果,但不能替代L2正则化或Dropout。如果你在处理多层的深度学习模型,建议同时使用批量归一化和L2正则化或Dropout等技术。批量归一化能让模型训练得更快更稳定,而正则化能保证模型有良好的泛化能力。
实际考虑
在调整深度学习模型的正则化参数时,有几个因素需要考虑:
- 网络深度:网络越深,过拟合的可能性越大。建议随着网络深度增加,相应增强L2正则化或Dropout的强度。
- 学习率调度:正则化和学习率紧密相关。如果学习率过高,即便采用了很好的正则化方法,也可能无法避免过拟合。可以结合学习率调度(如学习率衰减或周期性学习率)和正则化来调整模型。
- 批次大小:较小的批次会在梯度下降过程中引入噪声,这也能起到一定的正则化作用。但如果批次非常大,就需要加大正则化强度,以防止过拟合。
例如,在使用卷积神经网络(CNN)进行图像分类时,我通常会在更深的层中同时使用Dropout(0.5)、L2正则化和批量归一化,并随着模型训练动态调整学习率。
可视化正则化的效果
绘制权重分布
你可能好奇,应用L1或L2正则化时,模型权重究竟发生了什么变化?可视化这些效果能帮助我们深入理解每种正则化技术是如何改变模型的。下面来具体分析一下。
L1正则化
应用L1正则化时,惩罚项会使部分权重精确归零,从而产生稀疏性,这意味着模型只选择最重要的特征。如果绘制应用L1正则化前后的权重分布,会发现很多较小的权重消失了。图表看起来会更紧凑,大部分权重集中在零附近。
L2正则化
相比之下,L2正则化会使权重分布更分散。它会惩罚较大的权重,但不会像L1那样将权重推至零,而是更平滑地减小所有权重的幅值。应用L2正则化后的权重分布图显示,权重分布更均匀,值也更小,不会完全消除任何特征。
可视化示例
下面展示如何使用Python中的matplotlib和seaborn库进行可视化。你可以绘制有正则化和没有正则化的模型的权重分布。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import Ridge, Lasso
weights_no_reg = np.random.normal(size=100)
weights_l1 = np.random.normal(scale=0.5, size=80)
weights_l2 = np.random.normal(scale=0.3, size=100)
plt.figure(figsize=(10, 6))
sns.histplot(weights_no_reg, color="blue", label="No Regularization", kde=True)
sns.histplot(weights_l1, color="red", label="L1 Regularization", kde=True)
sns.histplot(weights_l2, color="green", label="L2 Regularization", kde=True)
plt.title('Weight Distributions Before and After Regularization')
plt.legend()
plt.show()
正则化的特征重要性
L1正则化的一个有趣之处在于它对特征重要性的改变。L1将某些特征权重推至零的过程,实际上就是在进行特征选择。对于高维数据集,比如含有数千个特征的基因表达数据集,L1正则化会自动筛选出最具影响力的特征。
为了直观呈现这一点,可以绘制正则化前后模型的系数,突出L1将多少特征设置为零。这有助于理解为什么一个更简单、更易解释的模型,即便使用的特征少得多,却依然能保持较高的准确性。
Python中的代码实现
使用Scikit-learn进行L1和L2正则化
了解了正则化的理论原理后,下面来看看实际操作。以下是如何使用Scikit-learn实现L1(Lasso)和L2(Ridge)正则化。
from sklearn.linear_model import Lasso, Ridge
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.datasets import make_regression
from sklearn.metrics import mean_squared_error
X, y = make_regression(n_samples=1000, n_features=50, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
lasso = Lasso()
params = {'alpha': [0.001, 0.01, 0.1, 1, 10]}
grid_lasso = GridSearchCV(lasso, params, cv=5)
grid_lasso.fit(X_train, y_train)
ridge = Ridge()
grid_ridge = GridSearchCV(ridge, params, cv=5)
grid_ridge.fit(X_train, y_train)
y_pred_lasso = grid_lasso.predict(X_test)
y_pred_ridge = grid_ridge.predict(X_test)
print(f"Lasso MSE: {mean_squared_error(y_test, y_pred_lasso)}")
print(f"Ridge MSE: {mean_squared_error(y_test, y_pred_ridge)}")
具有正则化的神经网络
接下来看看神经网络。以下是在TensorFlow和PyTorch等深度学习框架中实现L2正则化(权重衰减)的方法。
在TensorFlow中:
import tensorflow as tf
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(128, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01)),
tf.keras.layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01)),
tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test))
在PyTorch中:
import torch
import torch.nn as nn
import torch.optim as optim
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(50, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
model = Net()
optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=0.01)
criterion = nn.MSELoss()
for epoch in range(10):
model.train()
optimizer.zero_grad()
outputs = model(torch.tensor(X_train, dtype=torch.float32))
loss = criterion(outputs, torch.tensor(y_train, dtype=torch.float32))
loss.backward()
optimizer.step()
在上述两种框架中,weight_decay
或kernel_regularizer
参数确保了L2正则化应用于模型权重,有效防止过拟合。
推荐阅读
1. DeepSeek-R1的顿悟时刻是如何出现的? 背后的数学原理
2. 微调 DeepSeek LLM:使用监督微调(SFT)与 Hugging Face 数据
3. 使用 DeepSeek-R1 等推理模型将 RAG 转换为 RAT
4. DeepSeek R1:了解GRPO和多阶段训练
5. 深度探索:DeepSeek-R1 如何从零开始训练
6. DeepSeek 发布 Janus Pro 7B 多模态模型,免费又强大!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。