从3篇论文回顾2024年基础大语言模型的进展
2024
年,大语言模型(LLM)领域依旧保持着高速发展,坏消息和好消息并存。坏消息是大模型的规模Scaling
Law在可预见的未来将结束,可以从下面的证据里管中窥豹:
OpenAI的GPT-5一再跳票。发布的GPT-4.5调用成本非常高,但却只能从高情商而不是AGI去宣传。
Ilya在NIPS
2024上的演讲中指出"pre-training as we know it will
end(我们所知的预训练将会结束)"。
Meta训练的巨型LLM——Llama 3
405B也没有展现出在开源领域的绝对统治、
Claude
3.5及未来迭代版本都没有在超大杯opus上迭代了。
这些对超大规模大语言模型探索的失败为LLM后续发展也蒙上了一层阴霾,其原因Ilya也指出了:
因为计算机通过更好的硬件、更好的算法和逻辑集群不断增长,所有这些事情都在不断增加你的计算能力,而数据没有增长,因为我们只有一个互联网。
新数据的枯竭使得超大规模大语言模型训练的边际效应递减,看来靠超大规模的预训练走向AGI短时间应该是难有突破了。尽管预训练遭遇瓶颈,仍然有一些非常有前景的好消息,本篇博文专注于基础 ...
评估LLM之在24年的管理类联考逻辑选择题评估
之前回顾了HuggingFace数据集创建以及LLM评估工具的使用,算是对LLM评估有了一定的认识。这次主要是创建一个私有数据集,并在通过lm-evaluation-harness套件在这个数据集上尝试对LLM进行评估,算是实战一下数据集创建和评估工具使用。
创建的数据集从直觉上来说应该尽可能新,以防止泄露到LLM训练数据中,另外数据集本身可能需要一定的权威性和认可度。本文中使用2024年管理类联考的逻辑部分试题来作为评估集,手动将该数据集录入为文字版,称为MJEE_2024数据集。
数据集构建
从互联网上获取了2024年管理类联考的真题pdf,之后使用了逻辑推理部分的试题作为评估集。逻辑推理部分的试题全是选择题,便于评估时进行客观计分。
为了保证pdf转换为Markdown格式过程中数据的准确性,手动复制粘贴并调整格式以达到所有题目都满足同一个格式。格式要求如下:
12345<试题序号>.<题干内容><选项标签(A/B/C/D/E)>. <选项内容>参考答案: <答案选项>
如果题干内容中涉及到图形等视觉信息,向题干添加#n ...
在hexo博客中插入echarts图表
ECharts介绍
ECharts(Enterprise
Charts)是一个由百度团队开源的可视化图表库,基于 JavaScript
开发,主要用于创建交互式、响应式的可视化图表。它以强大的功能、灵活的配置以及出色的性能在数据可视化领域非常受欢迎。
它具有以下一些很好的特性:
图表类型丰富。支持折线图、柱状图、散点图、饼图、雷达图、热力图、树图、关系图等多种图表类型。甚至支持三维(3D)图表、地图可视化等。
强交互性。支持缩放、拖拽、动态更新、工具提示(tooltip)、联动视图等交互功能。
高性能。基于 Canvas 和 WebGL
渲染,能够高效处理大规模数据,适合展示百万级别的数据。
更多的信息可以参见官网:ECharts官网
在Hexo博客中插入ECharts图表
ECharts基于JavaScript开发,理论上是可以无缝嵌入到html页面的。而Markdown是一种轻量级的标记语言,虽然支持一些html标签用来排版,但对于加入ECharts这样使用JavaScript的用例是无能为力的。
但Hexo是将Markdown转换为静态的html页面再进行展示的,如果进行适当 ...
huggingface中Datasets模块的笔记
huggingface已经成为自然语言处理任务中最常用的网站之一了,里面提供了很多与自然语言处理甚至多模态相关的套件,对模型训练、模型评估以及模型部署提升效率有很大帮助。其中,很多套件都依赖Datasets加载数据集进行训练或评估,因此,掌握自定义Datasets的技能还是比较重要的。
要学习Datasets部分,大概需要了解两个部分,一是huggingface-cli的使用,二是datasets本身的配置。为了方便查找,两个部分的文档链接如下:
1. huggingface
cli文档 2. datasets文档
这边主要以上传一个数据集的示例,熟悉一下创建数据集的整个流程。
准备数据
要将数据集上传到hf上,首先得准备好数据。一般文本的数据集就是几个csv或者json能搞定,通过文件名区分不同的子集和划分。
这部分其实和hf关系不大,自己写python脚本准备即可。
创建数据集
虽然通过网页的GUI也可以创建仓库,但为了后续上传数据集的方便,这里也推荐使用huggingface-cli创建数据集。首先,检查一下huggingface装了没。另外就是检查一下版本,如果太久了就更新一下 ...
LLM评估
目前,大语言模型(LLM)已经变得非常复杂。在万亿(Trillion,
T)量级的token上进行了预训练,并且进行了SFT、RLHF等精密的后训练,LLM表现出了很强的指令遵循能力。
然而,在生产环境中,可能仍然有一些bad
case需要修复。另外,出于成本考虑,在保证性能可接受的前提下会用尽可能小的模型来降低推理成本。
这使得业务场景下LLM微调的需求很旺盛。构造一份目标任务的数据集,微调让LLM对其中的示例进行拟合可以很直接地修复bad
case,并使得参数量较小的模型快速提升目标任务的性能。然而,微调一方面拟合了目标任务数据集中的示例,另一方面又存在过拟合、灾难性遗忘等风险,可能影响模型在目标任务上的综合表现。为了趋利避害,建立完善的评估机制来最大化微调后模型的收益,最小化风险非常重要。
目前有一些框架已经能够处理LLM的评估了: 1. Evaluate 2. RAGAs 3. evals 4. lm-evaluation-harness(推荐)
5. Argilla
这些框架基本都能处理一些简单的LLM评估,但侧重于不同方面,也基本都有着一些独特的优势和局限性。
Evalua ...
word缺失字体的解决方案
用Word编辑学位论文的时候,发现封面上的文字和同学的有一些不一样。我的封面下方全是黑体,而他的字体比较丰富和生动。我一开始以为是用到旧模板了,但后来找他要了源word文件,发现其实是一个版本。然后对照看了一下才发现是我的电脑上缺失了模板上所需的字体,而word又贴心地进行了缺省字体替换,因此会造成一些区别。
要解决也比较简单,就是直接安装缺失字体的ttf就行,应该是缺这两款字体:
简启体.ttf
楷体_GB2312.ttf
安装好这两款字体之后就能正常显示了。
这种字体问题其实并不少见,比如对于python著名的绘图库matplotlib就长期存在“方块字”问题。就是在默认配置下使用该绘图库绘制中文汉字会出问题,所有汉字都会变成方块。原因是matplotlib默认使用DejaVu Sans字体,对中文缺乏支持。在Windows系统下一般切换为SimHei(黑体)就能正常绘制汉字了。Linux系统下可能系统里也没有能显示中文的字体,这时候也是一样,要下载所需字体的ttf并且安装该字体后再切换。
NLP基础知识补全-1
NLP基础知识补全
本文档旨在汇集NLP中一些常见的基础知识。主要包含损失函数、优化器、微调方法、Normlization
Layer、位置编码、激活函数、Attention实现、量化模型、常见大模型结构几部分。
损失函数
这部分主要参考知乎文章:损失函数(Loss
Function)(https://zhuanlan.zhihu.com/p/261059231)
1. 什么是损失函数?
一言以蔽之,损失函数(loss
function)就是用来度量模型的预测值f(x)与真实值Y的差异程度的运算函数,它是一个非负实值函数,通常使用L(Y,
f(x))来表示,损失函数越小,模型的鲁棒性就越好。
2. 为什么使用损失函数?
损失函数使用主要是在模型的训练阶段,每个批次的训练数据送入模型后,通过前向传播输出预测值,然后损失函数会计算出预测值和真实值之间的差异值,也就是损失值。得到损失值之后,模型通过反向传播去更新各个参数,来降低真实值与预测值之间的损失,使得模型生成的预测值往真实值方向靠拢,从而达到学习的目的。
3. 有哪些损失函数?
3.1 基于距离度量的损失函数
基于距离度量的损失函数通 ...
田忌赛马问题
田忌赛马是一个很经典的故事,即田忌和齐威王赛马,虽然同等级的马不如齐威王的,但通过“上对中,中对下,下对上”这样的策略3局2胜。
问题限制在3匹马这样的范围很容易脑补出可行方案,但如果规模更大的问题呢,如何去编程解决?以一道leetcode上的田忌赛马类似题870.
优势洗牌来进行说明。把nums1当作田忌所有马的能力值,nums2当作齐威王所有马的能力值,返回一个田忌所有马的出战顺序使得对齐威王的优势最大。
贪心法
可以这样思考,我们先对田忌手里的马按能力从小到大排序,然后每次取能力最小的马,如果能战胜齐威王的任何一匹马,那就派它和这匹能战胜的马战斗并拿下一分,反之,则和齐威王目前最厉害的马战斗,为之后的中马战下马争取机会。
为了快速找到能战胜的马,齐威王的马也需要排序,从小到大排序如果目前能力最小的马都战胜不了那就和目前最厉害的马战斗。这样我们可以想到用排序和双指针,一个指针指向当前最弱的马,另一个指向最强的马。
又因为需要返回带顺序的排列结果,所以实际不能对nums2排序,这样会丢失原来的出战顺序。我们可以对下标排序,用lambda表达式可以很好地做到用元素值对下标排序。
最后, ...
笔试杂项20240917
记录一下遇到的不会的杂类选择问题。
计算机网络
tcp报文
一个TCP连接的建立是通过三次握手来实现的
–> [SYN] –> (B)
假如服务器B和客户机A通讯. 当A要和B通信时,A首先向B发一个SYN
(Synchronize) 标记的包,告诉B请求建立连接.
注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources).
认识到这点很重要,只有当B受到A发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能主动连接外部任何主机,除非不是TCP协议。
<– [SYN/ACK] <–(B)
接着,B收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.
注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.
–> [ACK] –> (B)
A收到SYN/ACK
包,A发一个确认包(ACK),通知B连接已建立。至此,三次握手完成,一个TCP连接完成
Note: ACK包就是仅ACK ...
python中的位运算
经常有一些题目的模拟题会结合位运算考察模拟能力,如果位运算能力不过关往往会被位运算本身所缠住。这在python这种语言使用者上应该问题更大,因为有强大的类库解决各类计算问题,实际很少用到低层的位运算,甚至对整数的二进制api一无所知导致连两数异或这样的操作也得自己写,不仅性能可能有问题,而且非常浪费时间。因此在这里补强一下位运算。
整数在计算机中是以二进制的形式表示的,二进制的每位数字都是0或1。位运算是把数字用二进制表示后,对每位上0或1的运算。位运算只有6种:非、与、或、异或、左移和右移,在python中几乎都有现成的简明实现。
位运算名称
作用
Python用法
示例
非 (NOT)
按位取反,将0变1,1变0
~
~5 结果为 -6
与 (AND)
按位与操作,两位都为1时为1
&
5 & 3 结果为 1
或 (OR)
按位或操作,只要有一位为1即为1
|
5 | 3 结果为 7
异或 (XOR)
按位异或,相同为0不同为1
^
5 ^ 3 结果为 6
左移 (<<)
将位向左移,低位补0
<<
...