【Python】科研代码学习:十五 configuration,tokenization 的代码细节:Llama 为例

这篇具有很好参考价值的文章主要介绍了【Python】科研代码学习:十五 configuration,tokenization 的代码细节:Llama 为例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  • 对于 HFTransformers 库的经典 API 以及大致架构我们都从前面已经学习的差不多了
    【动机】那还剩下几个小问题,就是:
    TokenizerSpecific Model 的运作原理是什么?
    我如何查看与修改模型的架构?前向与反向传播过程?损失计算?激活函数?
    这些模型层面的内容,如何学习与具体操作?
  • 这里,建议是 【Github:Transformers/model/llama】 查看自己使用的模型,并学习其中 tokenizationconfigmodeling 三个最重要的类

LlamaConfig:网络参数配置

  • 首先看定义类的地方,我们之前已经学习过了,SpecificConfig 都是从 PretrainedConfig 继承过来的
class LlamaConfig(PretrainedConfig):
  • 然后看一下解释文档,这里设置了一些比较重要的配置参数,主要是设置神经网络的大小和编码的一些参数。
    vocab_size:词汇表大小,默认 32000
    hidden_size:隐藏层维度(即每一层的神经元个数),默认 4096
    num_hidden_layers:隐藏层层数,默认 32
    intermediate_sizeMLP 层的层数,默认 11008
    num_attention_head:每一个注意力层的注意力头的个数,默认 32
    hidden_act:非线性层的激活函数,默认为 silu
    max_position_embeddings:最大位置编码(也就是输入到的序列长度),用于位置编码
    initializer_range truncated_normal_initializer 初始化方法的 std dev
    不同的 config 他们的参数可能不相同。
    Args:
        vocab_size (`int`, *optional*, defaults to 32000):
            Vocabulary size of the LLaMA model. Defines the number of different tokens that can be represented by the
            `inputs_ids` passed when calling [`LlamaModel`]
        hidden_size (`int`, *optional*, defaults to 4096):
            Dimension of the hidden representations.
        intermediate_size (`int`, *optional*, defaults to 11008):
            Dimension of the MLP representations.
        num_hidden_layers (`int`, *optional*, defaults to 32):
            Number of hidden layers in the Transformer encoder.
        num_attention_heads (`int`, *optional*, defaults to 32):
            Number of attention heads for each attention layer in the Transformer encoder.
        hidden_act (`str` or `function`, *optional*, defaults to `"silu"`):
            The non-linear activation function (function or string) in the decoder.
        max_position_embeddings (`int`, *optional*, defaults to 2048):
            The maximum sequence length that this model might ever be used with. Typically set this to something large
            just in case (e.g., 512 or 1024 or 2048).
        initializer_range (`float`, *optional*, defaults to 0.02):
            The standard deviation of the truncated_normal_initializer for initializing all weight matrices.
        rms_norm_eps (`float`, *optional*, defaults to 1e-12):
            The epsilon used by the rms normalization layers.
        use_cache (`bool`, *optional*, defaults to `True`):
            Whether or not the model should return the last key/values attentions (not used by all models). Only
            relevant if `config.is_decoder=True`.
        tie_word_embeddings(`bool`, *optional*, defaults to `False`):
            Whether to tie weight embeddings
        Example:

    ```python
    >>> from transformers import LlamaModel, LlamaConfig

    >>> # Initializing a LLaMA llama-7b style configuration
    >>> configuration = LlamaConfig()

    >>> # Initializing a model from the llama-7b style configuration
    >>> model = LlamaModel(configuration)

    >>> # Accessing the model configuration
    >>> configuration = model.config
    ```"""
  • 在代码中,它除了设置这些参数外,还做了几个额外的事情:
    设置 model_type = "llama"
    设置几个特殊的 token_id
pad_token_id=0
bos_token_id=1
eos_token_id=2

LlamaTokenizer:分词工具

  • LlamaTokenizer 自然也是继承自 PretrainedTokenizer
    第一件事情,设置 词汇表文件和 tokenizer文件
    设置位置编码的大小
    设置模型的输入名称,分为 input_ids 和注意力遮罩 attention_mask
VOCAB_FILES_NAMES = {"vocab_file": "tokenizer.model"}

PRETRAINED_VOCAB_FILES_MAP = {
    "vocab_file": {
        "hf-internal-testing/llama-tokenizer": "https://huggingface.co/hf-internal-testing/llama-tokenizer/resolve/main/tokenizer.model",
    },
    "tokenizer_file": {
        "hf-internal-testing/llama-tokenizer": "https://huggingface.co/hf-internal-testing/llama-tokenizer/resolve/main/tokenizer_config.json",
    },
}
PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES = {
    "hf-internal-testing/llama-tokenizer": 2048,
}

class LlamaTokenizer(PreTrainedTokenizer):
    """
    Construct a Llama tokenizer. Based on byte-level Byte-Pair-Encoding.

    Args:
        vocab_file (`str`):
            Path to the vocabulary file.
    """

    vocab_files_names = VOCAB_FILES_NAMES
    pretrained_vocab_files_map = PRETRAINED_VOCAB_FILES_MAP
    max_model_input_sizes = PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
    model_input_names = ["input_ids", "attention_mask"]
  • 第二步,在 init 方法中加载一些参数,并且添加了 bos, eos, unk, pad tokens
    添加了分词工具,使用的是 sentencepiece .SentencePieceProcessor;并加载了对应的词汇表文件
bos_token = AddedToken(bos_token, lstrip=False, rstrip=False) if isinstance(bos_token, str) else bos_token
eos_token = AddedToken(eos_token, lstrip=False, rstrip=False) if isinstance(eos_token, str) else eos_token
unk_token = AddedToken(unk_token, lstrip=False, rstrip=False) if isinstance(unk_token, str) else unk_token
pad_token = AddedToken(pad_token, lstrip=False, rstrip=False) if isinstance(pad_token, str) else pad_token

self.sp_model_kwargs = {} if sp_model_kwargs is None else sp_model_kwargs
self.sp_model = spm.SentencePieceProcessor(**self.sp_model_kwargs)
self.sp_model.Load(vocab_file)
  • 它提供了一些简单的 get, set, convert 等方法
    比如可以获得词汇大小 vocab_size,可以 get_vocab 获得所有词汇
    调用 convert_tokens_to_string(tokens) 可以把输入的 tokens 转成对应的字符串文本
    调用 _tokenize(text) 可以把输入的文本进行分词
    调用 _convert_token_to_id 可以把一个 token(str) 转成一个 id
    调用 _convert_id_to_token 可以把一个 id 转成一个 token(str)
@property
def vocab_size(self):
    """Returns vocab size"""
    return self.sp_model.get_piece_size()

def get_vocab(self):
    """Returns vocab as a dict"""
    vocab = {self.convert_ids_to_tokens(i): i for i in range(self.vocab_size)}
    vocab.update(self.added_tokens_encoder)
    return vocab
  • 发现好多这些都是单下划线开头的方法,表示是形式上是私有方法。
    ※ 所以我们只要知道该类可以做:
    输入的字符串(str),进行分词成 tokens (List[str])
    然后对 tokens 进行转成对应的 ids (List[int])
    也可以反过来,把 ids (List[int]) 还原成原来的 tokens (List[str])
    也可以反过来,把 tokens (List[str]) 还原成原来的字符串 str

文章来源地址https://www.toymoban.com/news/detail-842397.html

到了这里,关于【Python】科研代码学习:十五 configuration,tokenization 的代码细节:Llama 为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 十五个炫酷代码

       1 炫酷彩虹  视频是动态的,不信你运行试试。 2 狮子   3 旋转无尽的真心  4 炫酷螺旋  5 鲜艳的玫瑰  6 一颗小爱心   7 一个呆萌的皮卡丘 8 小猪佩奇  9 爱心树   10 小呆呆小黄人  11 十里桃花飘落(动态)  12 炸死小坏蛋 13 哆啦A梦  14 一个微信表情包   15 七夕

    2024年02月08日
    浏览(25)
  • RWEQ风蚀方程模型与ArcGIS数据处理Python代码库添加结合理论研究和科研实践

       RWEQ模型是应用比较普遍的能适应大区域定量估算风蚀量的模型。该模型是基于大量野外实验的一种经验模型,在实际测定风力导致的土壤侵蚀量以及当地的气象、地表植被、土壤湿度、地表的结皮和地表的可蚀性等因子的基础上得出的一个经验方程。 1、掌握土壤风蚀模

    2024年02月13日
    浏览(43)
  • 【Python】Python Flask token身份认证(附完整代码)

    前言 Python Flask是一个使用Python编写的轻量级Web应用框架,它可以非常方便地搭建Web应用。在Web应用中,经常需要进行身份认证,以确保只有授权用户才能访问某些资源。本文将介绍如何使用token进行身份认证,以及如何在Python Flask中实现token身份认证。 一、什么是token身份认

    2024年02月10日
    浏览(28)
  • python flask 令牌token原理及代码实现

    觉得废话多,可以直接看代码 代码参考:http://t.csdn.cn/Sf8km 令牌token解决了什么问题 解决http请求无状态的特性,让每次请求都有状态,知道请求是哪个用户发来的 首先要知道,http请求是无状态的 也就是说,即使是同一个人发送的两次请求,服务器也是不知道是同一个人过来

    2024年02月12日
    浏览(28)
  • 快速上手MATLAB:科研、工程、数据分析,MATLAB入门(上)教你基础知识!+分享MATLAB完全学习手册资料(视频+课件+代码

    1、《MATLAB完全学习手册(视频+课件+代码)》 2、《MATLAB入门》 3、《详解MATLAB在科学计算中的应用》 4、《案例二 MATLAB与Excel交互》 5、《MATLAB初学者教程 MATLAB编程-菜鸟入门(清晰版)》 6、《MATLAB常用函数参考 MATLAB函数汇总 精通MATLAB》 7、等等。。。。 编程语言基础:M

    2024年02月06日
    浏览(41)
  • 学习 Python 之 Pygame 开发魂斗罗(十五)

    在上次的博客学习 Python 之 Pygame 开发魂斗罗(十四)中,我们加入桥和修复了一些问题,在这篇博客中我加入boss。 下面是图片的素材和源码,我把源码也放到了网盘 链接:https://pan.baidu.com/s/1X7tESkes_O6nbPxfpHD6hQ?pwd=hdly 提取码:hdly 网盘中,代码如下 Teach是博客中发的代码,每

    2024年02月03日
    浏览(35)
  • Android问题笔记二十五:在构建提示“Could not resolve all files for configuration ‘:app:debugRuntimeClasspath”

    专栏分享 点击跳转=Unity3D特效百例 点击跳转=案例项目实战源码 点击跳转=游戏脚本-辅助自动化 点击跳转=Android控件全解手册 点击跳转=Scratch编程案例 点击跳转=软考全系列 众所周知,人生是一个漫长的流程,不断 克服困难 ,不断反思前进的过程。在这个过程中会产生很多对

    2024年02月03日
    浏览(38)
  • Spring Authorization Server入门 (三) 集成流程说明、细节补充和各种方式获取token测试

    在上一篇文章中的AuthorizationConfig.java配置类中,类上有三个注解,分别是@Configuration、@EnableWebSecurity和@EnableMethodSecurity注解,虽然在类中有注释,但是这里在细讲一下,同时放一下官网的说明 @EnableWebSecurity 加载了WebSecurityConfiguration配置类, 配置安全认证策略。 加载了Authenti

    2024年02月11日
    浏览(35)
  • UNet深度学习模型在医学图像分割中的应用及其Python实现细节

    第一部分:引言和UNet架构简介 引言 : 医学图像分割是医疗图像处理的重要领域,它涉及将图像划分为多个区域,以标识和隔离感兴趣的区域(如器官、肿瘤等)。近年来,随着深度学习技术的发展,多种神经网络模型被应用于这一领域。其中,UNet模型因其出色的表现而受

    2024年02月12日
    浏览(27)
  • Python拼图游戏源代码,可定制拼图图片,支持多种难度,可九宫格、十六宫格、二十五宫格

    配置环境 安装pygame模块 pip install pygame 引入资源 将照片,添加到resources/pictures路径下 照片.jpg格式 主函数代码 pintu.py 一个配置文件cfg,一个资源路径resources,存放字体和图片。 主函数代码放在这里: 1、定义四个可移动函数,在存在空格的情况下,允许向空格的方向移动。

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包