V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Richard14
V2EX  ›  Python

预训练模型在预训练时操作是如何做的?

  •  
  •   Richard14 · 357 天前 · 1639 次点击
    这是一个创建于 357 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有脱敏数据需要单独训练,无法使用网上开源的预训练参数。

    查了半天,感觉网上讲设计的很多,讲 finetune 的也不少,唯独没有讲预训练的。毕竟 bert 是 18 年出的,现在过了这么多年了我感觉其实算力方面的限制是还好,只要自己有资料,也没有说非得大中科研机构才能搞预训练吧。

    比如我一直疑惑一个典型问题,如果我像 bert 原始论文那样用两个任务预训练一个模型,那所谓的预训练就是先训练 A 任务至收敛然后再训练 B 任务至收敛?还是交叉每个任务训练一个 batch 这样?

    如果预训练是这样,那训练任务的顺序感觉会对最终得点有影响,最起码会对收敛速度有影响吧,不过英文搜了半天也没搜到啥相关文章,可能还是想的不对?

    还有一个问题是参数,看到有 paper 是把 NLP 模型的参数直接拿过来给生物领域的模型做初始化。这个有啥相关研究么,没啥关系的东西怎么能万事万物皆准?

    14 条回复    2023-12-01 17:54:53 +08:00
    chesha1
        1
    chesha1  
       357 天前   ❤️ 1
    前面不懂,关于最后一个问题,大模型+大数据集确实能大力出奇迹,clip 当年的卖点就是 zero-shot 效果堪比监督学习,所以只要你的数据够多,只要稍微擦到一点边,看上去没什么关系的两个任务也能用预训练提升性能
    Huelse
        2
    Huelse  
       357 天前
    预训练就是魔法值,全凭经验
    NoOneNoBody
        3
    NoOneNoBody  
       357 天前   ❤️ 1
    网上有些从零开始训练自己模型的文章,当然写得比较简单(包括例子和步骤),但基本就是这样
    就是数据、打 tag 、调参训练

    现在一些公开的预训练模型是非常复杂的,关键是调参,一来参数比上述的例子多得多,二来步骤也是反反复复,不是一次训练就完成的,每一次调参都要重新训练并对比结果,然后逐步收敛参数的范围,直到连续多次的训练测试结果接近才能视为完成,如果遇到结果不理想(无法突破预想效率值),甚至要推倒重来

    为什么这些模型都是一些机构发布,而不是个人,就是因为个人搜集数据能力有限,算力有限,做这些复杂训练少点硬件投资都没什么用,例如 openai 早期的模型租用了多少算力?所花的钱哪怕给我一成,我都可以完全躺平过完剩下的日子了
    如果你想看一些预训练模型是怎么得出来的,要去技术杂志搜,前提是他们有公开,例如之前超导那事,别人可以用公开的数据进行实验或验证
    Richard14
        4
    Richard14  
    OP
       357 天前
    @NoOneNoBody 不过超参这些,比如你上 huggingface 就都有实现参考吧,扒一套不就完事了,剩下的稍微改改大差不差。主要问题是我看了几个项目的开源码,网络结构还挺清晰,但是预训练逻辑只能说完全看不懂。如果只有一个预训练任务那直接练就是了,不过现在哪有一个任务预训练的,光汇总文献里就多少种方法了。
    NoOneNoBody
        5
    NoOneNoBody  
       357 天前
    @Richard14 #4
    我举个自己的例子吧,虽然跟人家没法比,但过程是可以说一说的
    我用 KNN 做一个小小小小模型,数据少于 1w ,tag 只有两个:True/False ,可以说极其简单了
    这个模型基本各种参数都选定了,不用调,唯一要调整的近邻 n 的个数,可选为 4~15 ,共 12 个
    然后将数据随机方式分 20 组,每组有训练样本和测试样本
    将每组和 12 个可选参数,用训练样本各训练一次,然后用测试样本测试,这样共 240 次测试
    最终选定 n=8 ,因为 n=8 时所有测试结果都落在 96.5~98%之间,是最稳定的
    其实 96~98%并非最好的,当 n=12 时,有三组得出了 99%以上的,但是 n=12 的其他 17 组,最低还出现 88%,分布很乱;所以 n=12 是不能用的,因为用到真正产出时,结果的准确性无法预计

    我想说的是,光一个仅 12 可选项的参数的调参工作,工作量就达到 240 组,多个参数可想而知,这里 KNN 的训练只是纯粹打包,几分钟而已,而有些模型的一次训练就要几小时甚至几天(视乎算力)
    当然,可以只用一组作为调参测试就选定参数(只跑 12 次),但实用时的结果嘛……可能要骂娘了

    然后,上述还忽略了一个重要问题:采样数据是否合理,如果不合理,前面说的所有的工作都是白搭
    因为我个人能力有限,只能获得这小一万的数据,更多我就要花钱雇人帮我收集了,还不是雇一个人就能搞定的
    所以我手头的这一万数据,是否有代表性,分布是否合理,这里还有采样学的分析(上面只是默认为合理)
    例如我要做一个买菜意愿的模型,然后我从程序员采集了一万数据,但程序员买菜的极少,这样的数据做出的模型用在评估家庭主妇,那就是错漏百出、惨不忍睹,大概就是这个意思
    例如现在的公开人脸提取模型,用于欧洲人比亚洲人更精准,就是因为采集做模型的数据欧洲人占多这个原因

    你如果看过我写的其他帖子(回复帖),我说过,AI 是一个长久的工作,需要几代人努力,包括机器学习和深度学习,目前还没有一个算法能通吃不同领域的,所以做模型时还有选数学算法(或者组合算法)的步骤
    目前文献还是说基础算法的实现,至于用到实处,因为不同的数学算法在不同领域表现不同,就需要做业务模型的人自己来选择并测试了,文献换个角度看就是说某个算法能把模型做出来,但结果不能打包票
    例如我上面这个例子,用 CNN 或者其他也能做,只是我嫌麻烦(部分是不熟悉),所以没有用其他算法测试,说到底就是懒,96%的结果我可以接受,如果只有 70%,我可能就要硬着头皮换其他了,那样的话又是新一轮工作量了
    FlyingBackscratc
        6
    FlyingBackscratc  
       357 天前   ❤️ 1
    @NoOneNoBody 回答了一长串但是不知道想表达啥,好像和原题无关?
    NoOneNoBody
        7
    NoOneNoBody  
       357 天前
    @FlyingBackscratc #6
    说了半天原来是我理解错了,你说的“预训练”就是训练,我以为是说预训练模型,后者是说现在已经公布的一些模型,如 128 点人脸检测模型、5 点人脸检测模型、车辆辨别模型……诸如此类

    回答你最后一句吧,数学算法一样的话,训练参数是类似的
    我有做三个模型,都是用 KNN ,一个人脸、一个文字,一个销售,它们后面的步骤,从训练到测试代码是基本相同的,包括参数
    不同的是输入的样本数据,一个用人脸检测模块从图像提取人脸特征,一个用分词提取特征、一个用统计数据量化,都转为二维 numpy (这步是归一),扔进相同的训练代码和检测代码,就能分出结果,KNN 只是个数学算法,它并不理会数据的实际“意义”(人脸、NLP 、医学还是销售……),它只管哪个数据对应哪个标签,维度相同就行,其他数学算法也类似,只要是合理的数目就行

    只用数字算结果为数学模型,把其中的数字附上实际意义则为业务模型,业务模型千变万化,但基础数学模型并没有很多,感觉上很多只是衍生和组合,例如所有的距离算法思想是一样的,就是求两个点的空间距离,不同的只是求这个距离的公式,有欧氏距离、余弦距离……等等
    NoOneNoBody
        8
    NoOneNoBody  
       357 天前
    @FlyingBackscratc #6
    呃,看错了,你不是 OP ?
    GeekGao
        9
    GeekGao  
       356 天前
    你是想了解 自监督学习 过程的工程步骤?
    FlyingBackscratc
        10
    FlyingBackscratc  
       356 天前
    @NoOneNoBody 草(一种植物),显然不是
    FlyingBackscratc
        11
    FlyingBackscratc  
       351 天前   ❤️ 1
    我这两天大概查了一下,其他的一些开源实现似乎是同时在训练两个网络,然后把 mlm 和 nsp 任务的 loss 直接加和?这样来算最终 loss ,感觉确实是挺怪异的,仅供 OP 参考。虽然楼上老哥不知道在说啥,v2 逐渐变得不知所云也不是这两年的事了,可能没人回答也是因为确实现状是 gtp 吹得炸天响,实际上连 bertbase 都没上过的企业大有人在
    chy2v
        12
    chy2v  
       347 天前
    bert 中的两个 loss 就是一起训练的。参数的话需要看你的数据来设。
    Richard14
        13
    Richard14  
    OP
       345 天前
    @chy2v
    @FlyingBackscratc 看了看谷歌的开源实现好像确实是这么做的,不过这么搞的话,两个 loss 的权重也不一样,不会让任务受到 loss 较大的那个影响么。。。。
    chy2v
        14
    chy2v  
       344 天前
    @Richard14
    这两个任务用的同一个 loss function, loss 一般来说大小差不多。差的比较大的话需要自己设定一下权重。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1562 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:12 · PVG 01:12 · LAX 09:12 · JFK 12:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.