• 【Python学习笔记】Optuna + Transformer B站视频实践


    【Python学习笔记】Optuna + Transformer 实践

    背景前摇(省流可不看):
    之前以泰坦尼克号数据集为案例,学习了Optuna的基本操作,为了进一步巩固知识和便于包装简历,决定找个唬人一点的项目练练手。
    ————————————————————————————————————————————
    B站大学学习视频:【手把手带你实战HuggingFace Transformers-番外技能篇】基于Optuna的transformers模型自动调参
    https://www.bilibili.com/list/watchlater?oid=875968820&bvid=BV1NN4y1S7i8&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
    传送门
    ————————————————————————————————————————————
    正文:
    划重点:权重参数是模型(通过梯度下降等)自己一点点学到的,超参数是需要人为设置的。
    按我的理解打个粗略的比方:权重参数表示模型“学什么”,超参数表示模型“怎么学”。比如说一个学生要上学,如果父母有车有时间送,那就坐家里的车去学校,如果父母没车或者没时间,他就走路或者骑自行车、坐公交等去学校。他怎么去学校很大程度上他父母会决定,当然要是他父母没说话,他自己也会有个默认选择,这就是超参数。
    至于上学路上他花多久时间,走快点走慢点,要不要顺路买个早点或者等等同班同学,还是一大早直奔学校沉迷学习,这就是他自己决定看啥更重要了,即权重参数。(该例子很不贴切严谨,仅代表个人理解,请勿较真)
    在这里插入图片描述
    “一个最优目标的定义”,之前泰坦尼克号那个案例,最优目标就是希望均方根差(root mean square error,缩写RMSE)最小。
    ————————————————————————————————
    原作者的示例代码库下载地址:https://github.com/zyds/transformers-code
    添加链接描述
    在这里插入图片描述
    (看起来好NB好系统好全面的教程!在下技术小白先膜拜一波,感谢大佬的无私分享)
    找到这个名为hyp_tune_optuna.ipynb的代码:
    在这里插入图片描述
    ————————————————————————————————
    我一开始以为这个代码需要一个特别麻烦的库PyTorch(后面发现并不用……直接装需要的俩库就完事了……),还是把教程放在这里吧。
    第一次安装的话很费劲,大家想试试的千万做好耗时间的心理准备:
    https://cloud.tencent.com/developer/article/2154882
    腾讯云yyds
    在这里插入图片描述
    ————————————————————————————————————————————
    pip install 一下 transformer 和 dataset 库。
    在这里插入图片描述
    检查一下,原视频UP的Github,发现适配的Transformer是4.36.2的,先把这个搞定:
    (这我习惯不好,应该在开始跑项目装环境之前就先看看示例用的什么版本,免得后来费事卸载重装,大家不要学我。)
    在这里插入图片描述
    ————————————————————————————————————————————
    如果安装完这俩库,一运行还报一个huggingface相关的错,别担心,按照提示,输入命令‘pip install transformers -U’执行即可搞定。
    在这里插入图片描述
    前面几个Step主要在装库,载入数据集,创建模型等,正常运行即可。
    到Step4这里开始莫名其妙地扯拐:
    在这里插入图片描述
    RuntimeError: Failed to import transformers.models.bert.configuration_bert because of the following error (look up to see its traceback):
    Failed to import transformers.onnx.config because of the following error (look up to see its traceback):
    DLL load failed while importing _imaging: 找不到指定的模块。
    不要怕,遇到这种差东西的报错一般都是环境问题,复制报错让Kimi看看:
    在这里插入图片描述
    基本上看来是环境没配对造成的了,十有八九这个锅还是Python背。————————————————————————————————————————————

    后再运行发现他的报错变简单了:DLL load failed while importing _imaging: 找不到指定的模块。
    在这里插入图片描述
    再针对这个报错搜索,发现是Pillow版本太低导致的:
    发现输出还有bug,再搜:
    Map: 0%| | 0/6988 [00:00examples/s]
    Unexpected exception formatting exception. Falling back to standard exception
    Traceback (most recent call last):
    File “c:\Users\admin\anaconda3\envs\optuna-example\lib\site-packages\PIL\Image.py”, line 108, in
    raise ImportError(msg)
    ImportError: The _imaging extension was built for another version of Pillow or PIL:
    Core version: 10.4.0
    Pillow version: 9.3.0

    发现需要10.4.0版本的Pillow,那就卸载重新再装这个版本,中间搜到有人的教程说要多Uninstall几次。
    如果还是没效果的话把命令行和VSCode都关了重新打开运行试试,我就是VSCode这块反复装都报错,这块死活都过不去,一气之下全关了,换成Jupyter Notebook重新开始运行,结果一下子就好了,并且以后换成VSCode打开也没问题了。
    在这里插入图片描述
    后面遇到evaluate等库没有的话也不要怕,阅读报错提示+网上搜索,跟着教程pip install就是。人工智能这块就是装环境比较复杂,新手适应起来有一段时间,玩熟了就是小菜一碟了。
    ————————————————————————————————————————————
    把环境问题解决以后就可以顺利跑代码了,先展示一下运行效果:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可以看出这个运行时间真的需要很久,一上午过去了,最后一个代码块都还在读条中。这也是为什么我建议在把环境装上以后先把代码跑起来,然后再跟着视频学细节。(github的代码是UP老师已经改好的,所以不用担心好不容易跑完了结果发现代码要改的情况)
    ————————————————————————————————————————————
    在这里插入图片描述
    要进行自动调参,模型每一次调整都要重新进行初始化,这个时候就不能给一个现成已经初始化好的模型了,需要把初始化模型包装成一个方法提供给Trainer。
    在这里插入图片描述
    自动调参数据量比较大的时候,不想要输出特别多的日志,就把logging_steps调得大一些。
    在这里插入图片描述
    老师在这一段详细带了看后端代码,这一段要认真听。
    (顺便提一句,虽然看了不少教程,但我还是觉得计算机和人工智能的相关知识就和天上的星星一样多,无论怎么学都感觉还有好多不会的东西……)
    这里介绍了四种调参的后端,我们这里用到的是第一种,也是默认的Optuna。在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    跟着UP老师的指导一步步往里找,最后发现今天这种使用方式和之前的泰坦尼克号案例(详见主页上一篇文章)应用Optuna的方式有一些相似之处,最后都是回到安装库和字典传超参数。但是具体怎么调用的方式又有一些区别,先前那种更像是简明扼要直接定义一个对象就使用,这里用的感觉比较隐晦,不知道是不是算作一种封装?或者,集成?可能这就是大型项目和小白练手的区别吧。
    后面老师微改了一下代码,直接把字典放进这个函数指定超参数,感觉这就和泰坦尼克号案例里面直接调用的方式有点像了。

    泰坦尼克号案例使用Optuna的例子:https://www.kaggle.com/code/yunsuxiaozi/learn-to-use-the-optuna/notebook
    原网页传送门
    在这里插入图片描述
    ————————————————————————————————————————————
    一些代码细节:
    一前一后的这两个数字代表的是可调参数的范围:
    batch_size大多设置为2的倍数,按指数增长去调,而不是1加1这样改。
    在这里插入图片描述
    使用这种方式的时候,不仅仅可以调Batch_Size,还可以调整优化器,比如用Adam,SVD等,比如老师在后续视频中示范的这样:
    在这里插入图片描述
    ————————————————————————————————————————————
    我的电脑最后跑出来的结果:完成了8个Trial,但其实到第3个Trial的时候已经达到极限了。
    在这里插入图片描述
    对比一下UP老师的结果:
    在这里插入图片描述
    ————————————————————————————————————————————
    老师展示的训练案例:中间发现效果不理想,直接剪枝停掉这次实验。这也是超参数的策略之一,决定什么时候停止实验。在这里插入图片描述在这里插入图片描述

    在这里插入图片描述————————————————————————————————————————————
    最后UP老师的总结:
    在这里插入图片描述

  • 相关阅读:
    chrome Driver 使用教程
    软考证书具体用途--详细介绍
    使用NTP配置集群时间同步(CentOS 7.9操作系统)
    python解决浮点运算取整时值错误的问题
    C++继承
    【Node.js实战】构建商品管理系统:从前端到后端的全栈开发实践
    BiConsumer的使用
    thinkphp6 入门教程合集(更新中)
    SpringCloud(8月25号)
    深入了解桶排序:原理、性能分析与 Java 实现
  • 原文地址:https://blog.csdn.net/bailichen800/article/details/140362947