大模型学习-Huggingface(未完待续)

目录

什么是Huggingface

NLP要解决的任务

情感分析

demo

基本流程分析

Tokenizer要做的事


什么是Huggingface

Hugging Face 是一个专注于自然语言处理(NLP)和人工智能(AI)技术的平台与社区。它提供了许多强大的工具和资源,主要功能如下:

  1. Transformers 库:这是 Hugging Face 的核心库之一,包含了多种预训练的深度学习模型,特别是在自然语言处理任务中非常流行,如文本分类、问答系统、机器翻译和文本生成。这些模型基于 Transformer 架构,例如 BERT、GPT、T5 等。

  2. 模型库(Model Hub):Hugging Face 提供了一个开放的平台,用户可以上传、共享和使用预训练的模型。这个模型库支持超过数千个模型,涵盖不同的任务和语言。

  3. Datasets 库:该库包含各种开源数据集,允许研究人员和开发者轻松加载、处理和共享大型数据集,用于训练和评估模型。

  4. API 和服务:Hugging Face 还提供了各种 API 和云服务,帮助用户部署和使用 AI 模型,而不需要从零开始训练模型。用户可以直接通过 API 调用模型进行推理或微调(Fine-tuning)。

  5. 社区和开源:Hugging Face 是一个非常活跃的开源社区,致力于推动 AI 和 NLP 的前沿技术,用户可以共享模型、教程、代码和项目。

Hugging Face 的愿景是让 AI 和 NLP 技术更加易于使用和普及,使开发者和研究人员能够快速构建和部署复杂的语言模型应用。

NLP要解决的任务

情感分析

demo

打开pycharm,在终端执行命令,它会下载并安装 Hugging Face 的 transformers 库。

pip install transfomers

如果出现下面的报错

可以改成使用清华的镜像源进行下载

pip install transformers -i https://pypi.tuna.tsinghua.edu.cn/simple

下载好后,创建一个demo文件,输入以下代码

from transformers import pipeline

# 指定模型所在路径
model_path = "D:\model"

# 加载模型
pipe = pipeline("text-classification", model=model_path)


# 使用该 pipeline 进行情感分析
result = pipe(
    [
        "you are good",
        "sun of beach"
    ]
)

# 输出结果
print(result)

代码分析:这段代码的主要功能是使用 Hugging Face 的 transformers 库加载一个预训练的情感分析模型,并对给定的两个文本进行情感分析。

使用 pipeline 创建一个情感分析(sentiment analysis)模型。这个模型是预训练的,因此可以直接用于情感分类任务,通常分为正面(positive)和负面(negative)情感。

  • model_path:定义了模型文件所在的本地路径。在Windows系统上,使用双反斜杠\\来表示路径分隔符(因为反斜杠\\是转义字符)。这里路径指向模型存放的位置,包含了必要的文件如pytorch_model.binconfig.json、和vocab.txt等。
  • pipeline("text-classification"):加载一个用于文本分类的pipeline。text-classification是一种预定义任务,通常用于情感分析、主题分类等任务。
  • model=model_path:指定了加载模型的路径,而不是自动从Hugging Face服务器下载。如果模型文件位于本地路径D:\\model,则会从此路径加载模型和配置文件。
  • pipe([...]):对一组输入文本进行情感分析。这里输入了两个句子:"you are good" 和 "sun of beach"。
  • result:保存了分析的结果,通常包括每个文本的标签(如positivenegative)和置信度分数。

这里,我使用的是从本地中加载模型,因为直接通过代码去下载模型,会超时,尝试了很多次,都没有办法,所以只能在huggingface上手动下载了。

首先,在D盘中,创建model文件夹

在huggingface中下载所需要的文件,网址:Avichr/heBERT_sentiment_analysis 在 Main (huggingface.co)

注意,这里要科学上网才能访问

将下载好的三个文件放到model文件夹中

  • pytorch_model.bin:模型权重文件。
  • config.json:模型配置文件。
  • vocab.txt:如果你的模型需要词汇表(通常是 BERT 模型),这个文件用于加载词汇表。

然后就可以运行程序,程序可对输入的语句进行情感分析

基本流程分析

这张图展示了情感分析模型的基本流程,主要包括三个阶段:Tokenizer(分词器)、Model(模型)和Post Processing(后处理)。具体流程如下:

  1. Tokenizer(分词器)

    • 输入的原始文本为:“This course is amazing”。
    • 分词器将原始文本转换为词汇的索引 ID,即输入 ID:[101, 2023, 2607, 2003, 6429, 999, 102]。这些数字代表模型词汇表中每个词对应的编号。
  2. Model(模型)

    • 输入的 ID 被输入到模型中,模型处理这些数据并输出一个叫做 logits 的值。
    • Logits 是未归一化的预测结果,可以认为是模型对每个类别的“置信度”,输出的 logits 为:[-4.3630, 4.6859]。
  3. Post Processing(后处理)

    • Logits 经过后处理后,得出分类的最终预测结果。
    • 在这个例子中,情感分析任务的两个类别是正面情感和负面情感。模型预测结果显示:
      • 正面情感的概率为 99.89%。
      • 负面情感的概率为 0.11%。

总结来看,这个流程展示了一个情感分析模型从原始文本输入到预测输出的全过程。文本被分词成 ID,经过模型生成 logits,再通过后处理转化为最终的情感分类结果。

This course is amazing只有四个词,为什么编号不止4个?

这是一个常见的现象,原因如下:

  1. 特殊标记

    • 自然语言处理模型,尤其是基于 Transformer 的模型(如 BERT、GPT),会在输入序列的开头和结尾添加特殊标记。这些标记通常是 [CLS][SEP]。其中:
      • [CLS] 标记表示句子的开始,用于汇总整个句子的语义信息。
      • [SEP] 标记表示句子的结束,或在多句子任务中用作句子间的分隔符。

    在你的例子中,输入序列的编号 [101, 2023, 2607, 2003, 6429, 999, 102] 中:

    • 101[CLS] 的标记。
    • 102[SEP] 的标记。 这两个标记导致输入的编号比实际单词数量多了 2 个。
  2. 词的分解(子词标记化)

    • 现代语言模型使用的分词器通常会将一些词分解为更小的子词单元。这种机制被称为 子词标记化(Subword Tokenization)。如果模型词汇表中没有某个完整的词,它会将该词分解为几个子词。
    • 在你的例子中,单词“amazing”被分解为了两个子词,其中 6429999 分别代表“ama”和“##zing”。这种分解是为了应对词汇表的有限性,同时增强模型处理罕见或复杂词汇的能力。

因此,虽然 “This course is amazing” 只有 4 个词,但因为包含了特殊标记和子词分解,最终的输入 ID 序列会包含更多的编号。

Tokenizer要做的事

模型名称可在huggingface官网中找到


 

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,泛型是一种强类型机制,它可以让你在编译时检查类型错误,从而提高代码的安全性和可读性。在使用泛型时,我们经常会遇到父类和子类的泛型转换问题。 首先,我们需要明确一点:子类泛型不能转换成父类泛型。这是因为Java中的泛型是不协变的。例如,如果有一个类A和它的子类B,那么List<A>和List<B>之间是不存在继承关系的。 下面我们来看一个例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 } } ``` 在这个例子中,我们定义了Animal类和它的子类Dog。然后我们定义了两个List,分别是List<Animal>和List<Dog>。如果将List<Dog>赋值给List<Animal>,会出现编译错误。这是因为List<Animal>和List<Dog>之间不存在继承关系。 那么,如果我们想要让子类泛型转换成父类泛型,应该怎么办呢?这时我们可以使用通配符来解决问题。通配符可以表示任意类型,包括父类和子类。例如,我们可以将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 下面我们来看一个使用通配符的例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 List<? extends Animal> list3 = new ArrayList<>(); list3 = list2; // 正确 } } ``` 在这个例子中,我们定义了List<? extends Animal>来表示任意继承自Animal的类型。然后我们将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 总结一下,Java中的泛型是不协变的,子类泛型不能转换成父类泛型。如果需要实现子类泛型转换成父类泛型,可以使用通配符来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值