当前位置: 首页 > news >正文

大模型 Decoder 的生成策略

本文将介绍以下内容:

  • Introduction
  • Greedy Search
  • beam search
  • Sampling
  • Top-K Sampling
  • Top-p (nucleus) sampling
  • 总结

一、Introduction

1、简介

近年来,由于在数百万个网页数据上训练的大型基于 Transformer 的语言模型的兴起,开放式语言生成引起了越来越多的关注,其中包括OpenAI著名的GPT2模型。在条件开放式语言生成方面,取得了令人瞩目的成果。除了改进的 Transformer 架构和大规模无监督训练数据外,更好的 decoder 方法也起到了重要作用。

本文简要介绍了不同的解码策略,并展示了如何使用 huggingface 的 transformers 库来轻松实现它们!

本文介绍的所有功能都能用于自回归语言生成。简而言之,自回归语言生成是基于这样的假设,即一个词序列的概率分布可以分解为下一个词条件概率分布的乘积:
在这里插入图片描述
其中 W0 是初始上下文词序列;单词序列的长度 T 通常是生成时即时 (on-the-fly) 确定的,即当某个时刻 t 出现了 EOS token 则可以停止单词序列生成。

2、环境配置
a)、transformers 库安装
pip install -q git+https://github.com/huggingface/transformers.git
pip install -q tensorflow==2.1
b)、导入 gpt2 模型
import tensorflow as tf
from transformers import TFGPT2LMHeadModel, GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
# add the EOS token as PAD token to avoid warnings
model = TFGPT2LMHeadModel.from_pretrained("gpt2", pad_token_id=tokenizer.eos_token_id)

二、Greedy Search(贪婪搜索)

Greedy search 是最简单的解码方法。它选择概率最高的单词作为下一个单词: w t w_t wt = a r g m a x x argmax_x argmaxx P ( W ∣ W 1 : t − 1 ) P(W|W_{1:t-1}) P(WW1:t1)在每个时间步 t。下图显示了 Greedy search。
在这里插入图片描述
从 “The” 这个词开始,每一步都选择概率最大的单词,分别选择了 “nice” 和 “woman”,最后这样选择的整体概率为 0.5 * 0.4 = 0.2。

接下来,我们将使用GPT2在上下文(“I”, “enjoy”, “walking”, “with”, “my”, “cute”, “dog”)。让我们看看在transformers中如何使用贪婪搜索:

# encode context the generation is conditioned on
model_inputs = tokenizer('I enjoy walking with my cute dog', return_tensors='pt').to(torch_device)# generate 40 new tokens
greedy_output = model.generate(**model_inputs, max_new_tokens=40)print("Output:\n" + 100 * '-')
print(tokenizer.decode(greedy_output[0], skip_special_tokens=True))# Output:
# ----------------------------------------------------------------------------------------------------
# I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with my dog. I'm not sure if I'll ever be able to walk with my dog.
# I'm not sure if I'll

太好了!我们使用GPT2生成了我们的第一个短文本 。在上下文后生成的单词是合理的,但模型很快开始重复自己!这在语言生成中是一个非常常见的问题,而在Greedy Search(贪婪搜索)和 beam search (束搜索)中似乎更为明显。

然而,Greedy Search(贪婪搜索)的主要缺点是它会错过隐藏在低概率单词后面的高概率单词,就像我们上面的示例中所看到的那样:

高条件概率为0.9的单词"has"被隐藏在只有第二高条件概率的单词"dog"后面,所以贪婪搜索错过了单词序列 “The”,“dog”,“has”。

幸运的是,我们有 beam search(束搜索)来缓解这个问题!

三、beam search

beam search(束搜索)通过在每个时间步骤保留最有可能的 num_beams 个假设,最终选择具有最高概率的假设,从而降低错过隐藏的高概率词序列的风险。 让我们以 num_beams=2 的情况来说明:
在这里插入图片描述
在时间步骤1,除了最有可能的假设(“The”,“nice”)之外,束搜索还跟踪第二个最有可能的假设(“The”,“dog”)。在时间步骤2,束搜索发现词序列(“The”,“dog”,“has”)的概率为0.36,高于词序列(“The”,“nice”,“woman”)的概率(0.2)。太棒了,在我们的示例中,它找到了最有可能的词序列!

beam search (束搜索)总是能找到比 gready search (贪婪搜索) 更高概率的输出序列,但并不能保证找到最有可能的输出。

让我们看看在 transformers 库中如何使用束搜索。我们设置 num_beams > 1 和 early_stopping=True,这样当所有束假设都达到 EOS 符号时,生成就会结束。

# activate beam search and early_stopping
beam_output = model.generate(input_ids,max_length=50,num_beams=5,early_stopping=True
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(beam_output[0], skip_special_tokens=True))
# Output:
# ----------------------------------------------------------------------------------------------------
# I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with him again.# I'm not sure if I'll ever be able to walk with him again. I'm not sure if I'll

虽然结果可能更加流畅,但输出仍然包含相同的词序列的重复。
一个简单的解决办法是引入 n-gram(即由 n 个词组成的词序列)的惩罚,这是由 Paulus 等人(2017年) 和 Klein 等人(2017年) 引入的。最常见的n 元语法 惩罚通过手动将可能创建已见过的n元语法的下一个单词的概率设置 为 0 来确保 n 元语法不会出现两次。

让我们尝试一下,将 no_repeat_ngram_size 设置为 2,以确保没有重复出现的 2-gram:
让我们通过设置来尝试一下no_repeat_ngram_size=2,这样2-gram不会 出现两次:

# set no_repeat_ngram_size to 2
beam_output = model.generate(input_ids,max_length=50,num_beams=5,no_repeat_ngram_size=2,early_stopping=True
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(beam_output[0], skip_special_tokens=True))
# Output:
# ----------------------------------------------------------------------------------------------------
# I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with him again.# I've been thinking about this for a while now, and I think it's time for me to take a break

太好了,看起来好多了!我们可以看到不再出现重复的词序列。然而,使用 n-gram 惩罚时需要谨慎。生成有关纽约市的文章不应该使用 2-gram 惩罚,否则整个文本中只会出现一次城市的名称!

束搜索的另一个重要特性是,在生成后我们可以比较生成概率较大的束并选择最适合我们目的的生成束。

在 transformers 库中,我们只需将参数 num_return_sequences 设置为应返回的最高分束的数量。但请确保 num_return_sequences <= num_beams!

# set return_num_sequences > 1
beam_outputs = model.generate(input_ids,max_length=50,num_beams=5,no_repeat_ngram_size=2,num_return_sequences=5,early_stopping=True
)# now we have 3 output sequences
print("Output:\n" + 100 * '-')
for i, beam_output in enumerate(beam_outputs):print("{}: {}".format(i, tokenizer.decode(beam_output, skip_special_tokens=True)))
# Output:
# ----------------------------------------------------------------------------------------------------
# 0: I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with him again.# I've been thinking about this for a while now, and I think it's time for me to take a break
# 1: I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with him again.# I've been thinking about this for a while now, and I think it's time for me to get back to
# 2: I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with her again.# I've been thinking about this for a while now, and I think it's time for me to take a break
# 3: I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with her again.# I've been thinking about this for a while now, and I think it's time for me to get back to
# 4: I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with him again.# I've been thinking about this for a while now, and I think it's time for me to take a step

正如我们所看到的,这五个束的假设之间几乎没有太大的区别——当只使用 5 个束时,这应该并不令人太惊讶。

在开放式生成中,最近提出了几个原因,解释了为什么 beam search (束搜索) 可能不是最佳选择:

  • beam search (束搜索) 在诸如机器翻译或摘要生成等预期生成长度相对可预测的任务中效果非常好——参见 Murray 等人(2018年) 和 Yang 等人(2018年)。但是,在开放式生成中情况并非如此,期望的输出长度可能会有很大的变化,例如对话和故事生成。
  • 我们已经看到束搜索在重复生成方面存在严重问题。在故事生成中,使用 n-gram 或其他惩罚特别难以控制,因为在强制执行“不重复”和重复相同 n-gram 的循环之间找到良好的平衡需要进行很多微调。
  • 正如 Ari Holtzman 等人(2019年) 所论证的,高质量的人类语言并不遵循高概率的下一个词分布。换句话说,作为人类,我们希望生成的文本给我们带来惊喜,而不是无聊/可预测的。作者通过绘制模型对人类文本的概率与 beamsearch (束搜索) 的概率之间的对比,很好地展示了这一点。
    在这里插入图片描述
    所以让我们停止无聊并引入一些随机性。

四、Sampling

在其最基本的形式中,采样意味着根据条件概率分布随机选择下一个词
在这里插入图片描述
以前面的例子为例,下面的图形展示了使用采样进行语言生成的情况
在这里插入图片描述
很明显,使用采样进行语言生成不再是确定性的。 单词 (“car”) 从条件概率分布 P(w∣"The") 中进行采样,接着从条件概率分布 P(w∣"The",“car”) 中进行采样,选取了 (“drives”)。

在 transformers 库中,我们设置 do_sample=True,并通过 top_k=0 关闭 Top-K 采样(稍后详细介绍)。为了说明目的,我们将随机种子 random_seed 设置为 0。随意更改 random_seed 来尝试模型。

# set seed to reproduce results. Feel free to change the seed though to get different results
from transformers import set_seed
set_seed(42)# activate sampling and deactivate top_k by setting top_k sampling to 0
sample_output = model.generate(**model_inputs,max_new_tokens=40,do_sample=True,top_k=0
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))# Output:
# ----------------------------------------------------------------------------------------------------
# I enjoy walking with my cute dog for the rest of the day, but this had me staying in an unusual room and not going on nights out with friends (which will always be wondered for a mere minute or so at this point).

有趣!文本看起来还不错,但仔细观察发现,它并不是非常连贯。听起来不像是人类写的。这就是在 Sampling 采样词序列时的一个大问题:模型经常生成不连贯的胡言乱语, 参考 Ari Holtzman 等人(2019年)。

一个技巧是进行分布 P ( w ∣ w 1 : t − 1 ) P(w|w_{1:t-1}) P(ww1:t1) temperature 通过降低 softmax 的所谓值来变得更清晰(增加高概率单词的可能性并降低低概率单词的可能性)。

将温度应用于上面示例的示例如下所示。
在这里插入图片描述
第 t=1 步的条件下一个词分布变得更加尖锐,几乎没有机会选择单词 (“car”)。

让我们看看如何通过设置 temperature=0.6 来使分布变得更尖锐:

# set seed to reproduce results. Feel free to change the seed though to get different results
set_seed(42)# use temperature to decrease the sensitivity to low probability candidates
sample_output = model.generate(**model_inputs,max_new_tokens=40,do_sample=True,top_k=0,temperature=0.6,
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))# Output:
# ----------------------------------------------------------------------------------------------------
# I enjoy walking with my cute dog, but I don't like to chew on it. I like to eat it and not chew on it. I like to be able to walk with my dog."# So how did you decide

好的。现在奇怪的 n-gram 较少了,输出的连贯性稍微提高了一点!尽管应用温度可以使分布变得不那么随机,在温度设置为接近 0 时,温度调节的采样将等同于贪婪解码,并将面临与之前相同的问题。

五、Top-K Sampling

Fan et al.(2018年) 提出了一种简单但非常强大的采样方案,称为Top-K采样在Top-K采样中,选择最有可能的K个下一个词,并将概率质量重新分配给这 K 个下一个词。 GPT2采用了这种采样方案,这是其在故事生成中取得成功的原因之一。

为了更好地说明Top-K采样,我们将上述例子中两个采样步骤使用的词池范围从3个词扩展到10个词。
在这里插入图片描述
设定 K=6, 在两个采样步骤中,我们将采样池限制为6个词。尽管在第一步中,定义为
的 6 个最有可能的词仅占据了大约三分之二的概率质量,但在第二步中,几乎包含了所有的概率质量。尽管如此,我们可以看到它成功地消除了第二个采样步骤中相当奇怪的候选词 (“not”, “the”, “small”, “told”)。

让我们看看如何在库中使用Top-K,通过设置 top_k=50:

# set seed to reproduce results. Feel free to change the seed though to get different results
set_seed(42)# set top_k to 50
sample_output = model.generate(**model_inputs,max_new_tokens=40,do_sample=True,top_k=50
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))# Output:
# ----------------------------------------------------------------------------------------------------
#I enjoy walking with my cute dog for the rest of the day, but this time it was hard for me to figure out what to do with it. (One reason I asked this for a few months back is that I had a

非常不错!这段文本可以说是到目前为止最具人类风格的文本。然而,对于 Top-K 采样的一个关注点是它并不动态地调整从下一个词概率分布 P ( w ∣ w 1 : t − 1 ) P(w|w_{1:t-1}) P(ww1:t1) 中被过滤掉的词的数量。这可能是有问题的,因为一些词可能是从非常尖锐的分布中进行采样(上图中的右侧分布),而其他词则是从更加平坦的分布中进行采样(上图中的左侧分布)。

在步骤 t=1 时,Top-K 消除了采样词池中的 (“people”, “big”, “house”, “cat”),这些似乎是合理的候选词。另一方面,在步骤 t=2 时,该方法将 (“down”, “a”) 这两个不太合适的词包括在采样词池中。因此,将采样词池限制为固定大小的 K 可能会导致模型在尖锐分布中产生胡言乱语,并限制模型在平坦分布中的创造力。这种直觉导致 Ari Holtzman 等人(2019年) 创建了Top-p (或nucleus) 采样方法。

六、Top-p (nucleus) sampling

与仅从最可能的 K 个单词中进行采样不同,Top-p 采样从概率累积超过概率 p 的可能性最小的单词集中进行选择。然后,概率质量在该单词集中重新分配。 这样,单词集的大小(即单词集中的单词数)可以根据下一个单词的概率分布动态增加和减少。让我们用以下图形来说明。
在这里插入图片描述
**设定 p=0.92,Top-p采样选择最少数量的单词,以使其共同超过 92% 的概率质量,定义为
。在第一个例子中,这包括了 9 个最可能的单词,而在第二个例子中,它只需要选择前 3 个单词就可以超过 92%。**实际上非常简单!可以看到,它保留了一系列下一个单词可能性较低的单词,例如 P(w∣"The"),以及当下一个单词似乎更可预测时只有几个单词,例如 P(w∣"The",“car”)。

好了,现在在 transformers 库中尝试一下!通过设置 0 < top_p < 1,我们激活了 Top-p 采样:

# set seed to reproduce results. Feel free to change the seed though to get different results
tf.random.set_seed(0)# deactivate top_k sampling and sample only from 92% most likely words
sample_output = model.generate(input_ids,do_sample=True,max_length=50,top_p=0.92,top_k=0
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))
# Output:
# ----------------------------------------------------------------------------------------------------
# I enjoy walking with my cute dog. He will never be the same. I watch him play.# Guys, my dog needs a name. Especially if he is found with wings.# What was that? I had a lot o

太棒了,听起来就像是人类写的一样。嗯,也许还不完全是。

理论上,Top-p方法似乎比Top-K更优雅,但两种方法在实践中都表现良好。Top-p还可以与Top-K结合使用,这可以避免非常低排名的单词,同时允许一些动态选择。

最后,要获得多个独立采样的输出,我们可以再次设置参数 num_return_sequences > 1:

# set seed to reproduce results. Feel free to change the seed though to get different results
tf.random.set_seed(0)# set top_k = 50 and set top_p = 0.95 and num_return_sequences = 3
sample_outputs = model.generate(input_ids,do_sample=True,max_length=50,top_k=50,top_p=0.95,num_return_sequences=3
)print("Output:\n" + 100 * '-')
for i, sample_output in enumerate(sample_outputs):print("{}: {}".format(i, tokenizer.decode(sample_output, skip_special_tokens=True)))
# Output:
# ----------------------------------------------------------------------------------------------------
# 0: I enjoy walking with my cute dog. It's so good to have the chance to walk with a dog. But I have this problem with the dog and how he's always looking at us and always trying to make me see that I can do something
# 1: I enjoy walking with my cute dog, she loves taking trips to different places on the planet, even in the desert! The world isn't big enough for us to travel by the bus with our beloved pup, but that's where I find my love
# 2: I enjoy walking with my cute dog and playing with our kids," said David J. Smith, director of the Humane Society of the US.# "So as a result, I've got more work in my time," he said.

太酷了,现在你应该掌握了使用transformers让模型为你写故事的所有工具!

七、总结

Top-p 和 Top-K 采样似乎比传统的 gready search (贪婪搜索) 和 beam search (束搜索) 在开放式语言生成中产生更流畅的文本。然而,最近有更多的证据表明,gready search (贪婪搜索) 和beam search (束搜索) 的明显缺陷(主要是生成重复的单词序列)是由模型(尤其是模型的训练方式)引起的,而不是解码方法引起的,参见 Welleck等人(2019年)。此外,正如 Welleck等人(2020年) 所示,Top-K和Top-p采样也存在生成重复单词序列的问题。

在 Welleck等人(2019年) 的研究中,作者们通过人类评估显示,当调整模型的训练,beam search (束搜索) 可以生成比Top-p采样更流畅的文本。

开放式语言生成是一个快速发展的研究领域,通常情况下,并不存在一种适用于所有情况的解码方法,因此必须根据具体使用情况找到最佳方法。

参考:

  • How to generate text: using different decoding methods for language generation with Transformers
  • generate text的正确姿势
  • Huggingface 的 generate 方法介绍:top_p sampling、top_k sampling、greedy_search、beam_search

相关文章:

大模型 Decoder 的生成策略

本文将介绍以下内容&#xff1a; IntroductionGreedy Searchbeam searchSamplingTop-K SamplingTop-p (nucleus) sampling总结 一、Introduction 1、简介 近年来&#xff0c;由于在数百万个网页数据上训练的大型基于 Transformer 的语言模型的兴起&#xff0c;开放式语言生…...

队列和栈相互实现

相关题目 225. 用队列实现栈&#xff1a;弹出元素时&#xff0c;将对首的元素出列加到队尾&#xff0c;直到只剩下初始队列时队尾一个元素为止&#xff0c;然后弹出这个元素&#xff0c;即可实现LIFO 232. 用栈实现队列&#xff1a;用两个栈实现队列的功能&#xff0c;出栈时&a…...

Node.js 是如何处理请求的

前言&#xff1a;在服务器软件中&#xff0c;如何处理请求是非常核心的问题。不管是底层架构的设计、IO 模型的选择&#xff0c;还是上层的处理都会影响一个服务器的性能&#xff0c;本文介绍 Node.js 在这方面的内容。 TCP 协议的核心概念 要了解服务器的工作原理首先需要了…...

数据结构与算法之堆: Leetcode 215. 数组中的第K个最大元素 (Typescript版)

数组中的第K个最大元素 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。…...

SpringBoot快速入门

搭建SpringBoot工程&#xff0c;定义hello方法&#xff0c;返回“Hello SpringBoot” ②导入springboot工程需要继承的父工程&#xff1b;以及web开发的起步依赖。 ③编写Controller ④引导类就是SpringBoot项目的一个入口。 写注解写main方法调用run方法 快速构建SpringBoo…...

深度学习笔记_4、CNN卷积神经网络+全连接神经网络解决MNIST数据

1、首先&#xff0c;导入所需的库和模块&#xff0c;包括NumPy、PyTorch、MNIST数据集、数据处理工具、模型层、优化器、损失函数、混淆矩阵、绘图工具以及数据处理工具。 import numpy as np import torch from torchvision.datasets import mnist import torchvision.transf…...

高效的开发流程搭建

目录 1. 搭建 AI codebase 环境kaggle的服务器1. 搭建 AI codebase 环境 python 、torch 以及 cuda版本,对AI的影响最大。不同的版本,可能最终计算出的结果会有区别。 硬盘:PCIE转SSD的卡槽,, GPU: 软件源: Anaconda: 一定要放到固态硬盘上。 VS code 的 debug功能…...

浅谈OV SSL 证书的优势

随着网络威胁日益增多&#xff0c;保护网站和用户安全已成为每个企业和组织的重要任务。在众多SSL证书类型中&#xff0c;OV&#xff08;Organization Validation&#xff09;证书以其独特的优势备受关注。让我们深入探究OV证书的优势所在&#xff0c;为网站安全搭建坚实的防线…...

一篇博客学会系列(3) —— 对动态内存管理的深度讲解以及经典笔试题的深度解析

目录 动态内存管理 1、为什么存在动态内存管理 2、动态内存函数的介绍 2.1、malloc和free 2.2、calloc 2.3、realloc 3、常见的动态内存错误 3.1、对NULL指针的解引用操作 3.2、对动态开辟空间的越界访问 3.3、对非动态开辟内存使用free释放 3.4、使用free释放一块动态…...

【C++ techniques】虚化构造函数、虚化非成员函数

constructor的虚化 virtual function&#xff1a;完成“因类型而异”的行为&#xff1b;constructor&#xff1a;明确类型时构造函数&#xff1b;virtual constructor&#xff1a;视其获得的输入&#xff0c;可产生不同的类型对象。 //假如写一个软件&#xff0c;用来处理时事…...

蓝牙核心规范(V5.4)11.6-LE Audio 笔记之初识音频位置和通道分配

专栏汇总网址:蓝牙篇之蓝牙核心规范学习笔记(V5.4)汇总_蓝牙核心规范中文版_心跳包的博客-CSDN博客 爬虫网站无德,任何非CSDN看到的这篇文章都是盗版网站,你也看不全。认准原始网址。!!! 音频位置 在以前的每个蓝牙音频规范中,只有一个蓝牙LE音频源和一个蓝牙LE音频接…...

mysql双主+双从集群连接模式

架构图&#xff1a; 详细内容参考&#xff1a; 结果展示&#xff1a; 178.119.30.14(主) 178.119.30.15(主) 178.119.30.16(从) 178.119.30.17(从)...

嵌入式中如何用C语言操作sqlite3(07)

sqlite3编程接口非常多&#xff0c;对于初学者来说&#xff0c;我们暂时只需要掌握常用的几个函数&#xff0c;其他函数自然就知道如何使用了。 数据库 本篇假设数据库为my.db,有数据表student。 nonamescore4嵌入式开发爱好者89.0 创建表格语句如下&#xff1a; CREATE T…...

RandomForestClassifier 与 GradientBoostingClassifier 的区别

RandomForestClassifier&#xff08;随机森林分类器&#xff09;和GradientBoostingClassifier&#xff08;梯度提升分类器&#xff09;是两种常用的集成学习方法&#xff0c;它们之间的区别分以下几点。 1、基础算法 RandomForestClassifier&#xff1a;随机森林分类器是基于…...

计组——I/O方式

一、程序查询方式 CPU不断轮询检查I/O控制器中“状态寄存器”&#xff0c;检测到状态为“已完成”之后&#xff0c;再从数据寄存器取出输入数据。 过程&#xff1a; 1.CPU执行初始化程序&#xff0c;并预置传送参数&#xff1b;设置计数器、设置数据首地址。 2. 向I/O接口发…...

jsbridge实战2:Swift和h5的jsbridge通信

[[toc]] demo1: 文本通信 h5 -> app 思路&#xff1a; h5 全局属性上挂一个变量app 接收这个变量的内容关键API: navigation代理 navigationAction.request.url?.absoluteString // 这个变量挂载在 request 的 url 上 &#xff0c;在浏览器实际无法运行&#xff0c;因…...

集合原理简记

HashMap 无论在构造函数是否指定数组长度&#xff0c;进行的都是延迟初始化 构造函数作用&#xff1a; 阈值&#xff1a;threshold&#xff0c;每次<<1 &#xff0c;数组长度 负载因子 无参构造&#xff1a;设置默认的负载因子 有参&#xff1a;可以指定初始容量或…...

机器学习的超参数 、训练集、归纳偏好

一、介绍 超参数&#xff08;Hyperparameters&#xff09;和验证集&#xff08;Validation Set&#xff09;是机器学习中重要的概念&#xff0c;用于调整模型和评估其性能。 超参数&#xff1a; 超参数是在机器学习模型训练过程中需要手动设置的参数&#xff0c;而不是从数据…...

Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)

Leetcode1071. 字符串的最大公因子 对于字符串 s 和 t&#xff0c;只有在 s t … t&#xff08;t 自身连接 1 次或多次&#xff09;时&#xff0c;我们才认定 “t 能除尽 s”。 给定两个字符串 str1 和 str2 。返回 最长字符串 x&#xff0c;要求满足 x 能除尽 str1 且 x 能…...

如何像人类一样写HTML之图像标签,超链接标签与多媒体标签

文章目录 前言一、图像标签1.1 什么是图像标签&#xff1f;2.2 如何使用图像标签&#xff1f; 二、超链接标签2.1 什么是超链接标签&#xff1f;2.2 如何使用超链接标签&#xff1f; 三、多媒体标签3.1 什么是多媒体标签&#xff1f;3.2 如何使用多媒体audio标签&#xff1f;3.…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...