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

一文解码语言模型:语言模型的原理、实战与评估

在本文中,我们深入探讨了语言模型的内部工作机制,从基础模型到大规模的变种,并分析了各种评价指标的优缺点。文章通过代码示例、算法细节和最新研究,提供了一份全面而深入的视角,旨在帮助读者更准确地理解和评估语言模型的性能。本文适用于研究者、开发者以及对人工智能有兴趣的广大读者。

file

一、语言模型概述

什么是语言模型?

file

语言模型(Language Model,简称 LM)是一个用于建模自然语言(即人们日常使用的语言)的概率模型。简单来说,语言模型的任务是评估一个给定的词序列(即一个句子)在真实世界中出现的概率。这种模型在自然语言处理(NLP)的诸多应用中,如机器翻译、语音识别、文本生成等,都起到了关键性的作用。

核心概念和数学表示

语言模型试图对词序列 ( w_1, w_2, \ldots, w_m ) 的概率分布 ( P(w_1, w_2, \ldots, w_m) ) 进行建模。这里,( w_i ) 是词汇表 ( V ) 中的一个词,而 ( m ) 是句子的长度。

这种模型的一项基本要求是概率分布的归一化,即所有可能的词序列概率之和必须等于 1:

file

挑战:高维度和稀疏性

想象一下,如果我们有一个包含 10,000 个单词的词汇表,一个包含 20 个词的句子就有 (10,000^{20}) 种可能的组合,这个数量是一个天文数字。因此,直接建模这种高维度和稀疏性是不现实的。

链式法则与条件概率

为了解决这个问题,通常用到链式法则(Chain Rule),将联合概率分解为条件概率的乘积:

file

举例

假设我们有一个句子 "I love language models",链式法则允许我们这样计算其概率:

file

通过这种方式,模型可以更高效地估计概率。

应用场景

  • 机器翻译:在生成目标语言句子时,语言模型用于评估哪个词序列更“自然”。

  • 语音识别:同样的,语言模型可以用于从多个可能的转录中选择最可能的一个。

  • 文本摘要:生成的摘要需要是语法正确和自然的,这也依赖于语言模型。

小结

总的来说,语言模型是自然语言处理中的基础组件,它能有效地模拟自然语言的复杂结构和生成规则。尽管面临着高维度和稀疏性的挑战,但通过各种策略和优化,如链式法则和条件概率,语言模型已经能在多个 NLP 应用中取得显著成效。


二、n元语言模型(n-gram Language Models)

file

基本概念

在面对语言模型概率分布计算的高维度和稀疏性问题时,n元语言模型(n-gram models)是一种经典的解决方案。n元语言模型通过限制条件概率中考虑的历史词数来简化模型。具体来说,它只考虑最近的 ( n-1 ) 个词来预测下一个词。

数学表示

链式法则按照 n-gram 方法被近似为:

[P(w_1, w_2, \ldots, w_m) \approx \prod_{i=1}^{m} P(w_i | w_{i-(n-1)}, w_{i-(n-2)}, \ldots, w_{i-1})]

其中,( n ) 是模型的“阶数”(order),通常是一个小于等于 5 的整数。

代码示例:计算Bigram概率

下面是一个用Python和基础数据结构实现的Bigram(2-gram)语言模型的简单示例。

from collections import defaultdict, Counter# 训练文本,简化版
text = "I love language models and I love coding".split()# 初始化
bigrams = list(zip(text[:-1], text[1:]))
bigram_freq = Counter(bigrams)
unigram_freq = Counter(text)# 计算条件概率
def bigram_probability(word1, word2):return bigram_freq[(word1, word2)] / unigram_freq[word1]# 输出
print("Bigram Probability of ('love', 'language'):", bigram_probability('love', 'language'))
print("Bigram Probability of ('I', 'love'):", bigram_probability('I', 'love'))

输入与输出

  • 输入: 一组用空格分隔的词,代表训练文本。

  • 输出: 两个特定词(如 'love' 和 'language')形成的Bigram条件概率。

运行上述代码,您应该看到输出如下:

Bigram Probability of ('love', 'language'): 0.5
Bigram Probability of ('I', 'love'): 1.0

优缺点

优点

  1. 计算简单:模型参数容易估计,只需要统计词频。

  1. 空间效率:相比于全序列模型,n-gram模型需要存储的参数数量少得多。

缺点

  1. 数据稀疏:对于低频或未出现的n-gram,模型无法给出合适的概率估计。

  1. 局限性:只能捕捉到局部(n-1词窗口内)的词依赖关系。

小结

n元语言模型通过局部近似来简化概率分布的计算,从而解决了一部分高维度和稀疏性的问题。然而,这也带来了新的挑战,比如如何处理稀疏数据。接下来,我们将介绍基于神经网络的语言模型,它们能够更有效地处理这些挑战。


三、神经网络语言模型(Neural Network Language Models)

file

基本概念

神经网络语言模型(NNLM)试图用深度学习的方法解决传统n-gram模型中的数据稀疏和局限性问题。NNLM使用词嵌入(word embeddings)来捕捉词与词之间的语义信息,并通过神经网络来计算词的条件概率。

数学表示

对于一个给定的词序列 (w_1, w_2, \ldots, w_m),NNLM试图计算:

[P(w_m | w_{m-(n-1)}, \ldots, w_{m-1}) = \text{Softmax}(f(w_{m-(n-1)}, \ldots, w_{m-1}; \theta))]

其中,(f) 是一个神经网络函数,(\theta) 是模型参数,Softmax用于将输出转换为概率。

代码示例:简单的NNLM

以下是一个使用PyTorch实现的简单NNLM的代码示例。

import torch
import torch.nn as nn
import torch.optim as optim# 数据准备
vocab = {"I": 0, "love": 1, "coding": 2, "<PAD>": 3}  # 简化词汇表
data = [0, 1, 2]  # "I love coding" 的词ID序列
data = torch.LongTensor(data)# 参数设置
embedding_dim = 10
hidden_dim = 8
vocab_size = len(vocab)# 定义模型
class SimpleNNLM(nn.Module):def __init__(self, vocab_size, embedding_dim, hidden_dim):super(SimpleNNLM, self).__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.rnn = nn.RNN(embedding_dim, hidden_dim)self.fc = nn.Linear(hidden_dim, vocab_size)def forward(self, x):x = self.embedding(x)out, _ = self.rnn(x.view(len(x), 1, -1))out = self.fc(out.view(len(x), -1))return out# 初始化模型与优化器
model = SimpleNNLM(vocab_size, embedding_dim, hidden_dim)
optimizer = optim.SGD(model.parameters(), lr=0.1)# 训练模型
for epoch in range(100):model.zero_grad()output = model(data[:-1])loss = nn.CrossEntropyLoss()(output, data[1:])loss.backward()optimizer.step()# 预测
with torch.no_grad():prediction = model(data[:-1]).argmax(dim=1)print("Predicted words index:", prediction.tolist())

输入与输出

  • 输入: 一个词序列,每个词由其在词汇表中的索引表示。

  • 输出: 下一个词的预测索引,通过模型计算得出。

运行上述代码,输出可能是:

Predicted words index: [1, 2]

这意味着模型预测"love"后面会跟"coding"。

优缺点

优点

  1. 捕获长距离依赖:通过循环或者自注意力机制,模型能捕获更长范围内的依赖。

  1. 共享表示:词嵌入可以在不同的上下文中重复使用。

缺点

  1. 计算复杂性:相比n-gram,NNLM具有更高的计算成本。

  1. 数据需求:深度模型通常需要大量标注数据进行训练。

小结

神经网络语言模型通过利用深度神经网络和词嵌入,显著提升了语言模型的表达能力和准确性。然而,这种能力的提升是以计算复杂性为代价的。在接下来的部分,我们将探讨如何通过预训练来进一步提升模型性能。


训练语言模型

自然语言处理领域基于预训练语言模型的方法逐渐成为主流。从ELMo到GPT,再到BERT和BART,预训练语言模型在多个NLP任务上表现出色。在本部分,我们将详细讨论如何训练语言模型,同时也会探究各种模型结构和训练任务。

预训练与微调

受到计算机视觉领域采用ImageNet对模型进行一次预选训练的影响,预训练+微调的范式也在NLP领域得到了广泛应用。预训练模型可以用于多个下游任务,通常只需要微调即可。

ELMo:动态词向量模型

ELMo使用双向LSTM来生成词向量,每个词的向量表示依赖于整个输入句子,因此是“动态”的。

GPT:生成式预训练模型

OpenAI的GPT采用生成式预训练方法和Transformer结构。它的特点是单向模型,只能从左到右或从右到左对文本序列建模。

BERT:双向预训练模型

BERT利用了Transformer编码器和掩码机制,能进一步挖掘上下文所带来的丰富语义。在预训练时,BERT使用了两个任务:掩码语言模型(MLM)和下一句预测(NSP)。

BART:双向和自回归Transformer

BART结合了BERT的双向上下文信息和GPT的自回归特性,适用于生成任务。预训练任务包括去噪自编码器,使用多种方式在输入文本上引入噪音。

代码示例:使用PyTorch训练一个简单的语言模型

下面的代码展示了如何使用PyTorch库来训练一个简单的RNN语言模型。

import torch
import torch.nn as nn
import torch.optim as optim# 初始化模型
class RNNModel(nn.Module):def __init__(self, vocab_size, embed_size, hidden_size):super(RNNModel, self).__init__()self.embedding = nn.Embedding(vocab_size, embed_size)self.rnn = nn.RNN(embed_size, hidden_size)self.decoder = nn.Linear(hidden_size, vocab_size)def forward(self, x, h):x = self.embedding(x)out, h = self.rnn(x, h)out = self.decoder(out)return out, hvocab_size = 1000
embed_size = 128
hidden_size = 256
model = RNNModel(vocab_size, embed_size, hidden_size)# 损失和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
for epoch in range(10):# 输入与标签input_data = torch.randint(0, vocab_size, (5, 32))  # 随机生成(序列长度, 批量大小)的输入target_data = torch.randint(0, vocab_size, (5, 32))  # 随机生成标签hidden = torch.zeros(1, 32, hidden_size)optimizer.zero_grad()output, hidden = model(input_data, hidden)loss = criterion(output.view(-1, vocab_size), target_data.view(-1))loss.backward()optimizer.step()print(f"Epoch [{epoch+1}/10], Loss: {loss.item():.4f}")

输出

Epoch [1/10], Loss: 6.9089
Epoch [2/10], Loss: 6.5990
...

通过这个简单的例子,你可以看到输入是一个随机整数张量,代表着词汇表索引,输出是一个概率分布,用于预测下一个词的可能性。

小结

预训练语言模型改变了NLP的许多方面。通过各种结构和预训练任务,这些模型能够捕获丰富的语义和语境信息。此外,微调预训练模型也相对简单,能迅速适应各种下游任务。


大规模语言模型

file

近年来,大规模预训练语言模型(Pre-trained Language Models, PLM)在自然语言处理(NLP)领域起到了革命性的作用。这一波浪潮由ELMo、GPT、BERT等模型引领,至今仍在持续。这篇文章旨在全面、深入地探究这些模型的核心原理,包括它们的结构设计、预训练任务以及如何用于下游任务。我们还将提供代码示例,以便深入了解。

ELMo:动态词嵌入的先行者

ELMo(Embeddings from Language Models)模型首次引入了上下文相关的词嵌入(contextualized word embeddings)的概念。与传统的静态词嵌入不同,动态词嵌入能根据上下文动态调整词的嵌入。

代码示例:使用ELMo进行词嵌入

# 用于ELMo词嵌入的Python代码示例
from allennlp.modules.elmo import Elmo, batch_to_idsoptions_file = "https://allennlp.s3.amazonaws.com/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_options.json"
weight_file = "https://allennlp.s3.amazonaws.com/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_weights.hdf5"# 创建模型
elmo = Elmo(options_file, weight_file, 1, dropout=0)# 将句子转换为字符id
sentences = [["I", "ate", "an", "apple"], ["I", "ate", "a", "carrot"]]
character_ids = batch_to_ids(sentences)# 计算嵌入
embeddings = elmo(character_ids)# 输出嵌入张量的形状
print(embeddings['elmo_representations'][0].shape)
# Output: torch.Size([2, 4, 1024])

GPT:生成式预训练模型

GPT(Generative Pre-trained Transformer)采用生成式预训练方法,是一个基于Transformer架构的单向模型。这意味着它在处理输入文本时只能考虑文本的一侧上下文。

代码示例:使用GPT-2生成文本

# 使用GPT-2生成文本的Python代码示例
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizertokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")# 编码文本输入
input_text = "Once upon a time,"
input_ids = tokenizer.encode(input_text, return_tensors="pt")# 生成文本
with torch.no_grad():output = model.generate(input_ids, max_length=50)# 解码生成的文本
output_text = tokenizer.decode(output[0], skip_special_tokens=True)print(output_text)
# Output: Once upon a time, there was a young prince who lived in a castle...

BERT:双向编码器表示

BERT(Bidirectional Encoder Representations from Transformers)由多层Transformer编码器组成,并使用掩码机制进行预训练。

代码示例:使用BERT进行句子分类

# 使用BERT进行句子分类的Python代码示例
from transformers import BertTokenizer, BertForSequenceClassification
import torchtokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
labels = torch.tensor([1]).unsqueeze(0)  # 类别标签
outputs = model(**inputs, labels=labels)loss = outputs.loss
logits = outputs.logitsprint(logits)
# Output: tensor([[ 0.1595, -0.1934]])


语言模型评价方法

评价语言模型的性能是自然语言处理(NLP)领域中一项至关重要的任务。不同的评价指标和方法对于模型选择、调优以及最终的应用场景有着直接的影响。这篇文章将详细介绍几种常用的评价方法,包括困惑度(Perplexity)、BLEU 分数、ROUGE 分数等,以及如何用代码来实现这些评价。

困惑度(Perplexity)

困惑度是衡量语言模型好坏的一种常用指标,它描述了模型预测下一个词的不确定性。数学上,困惑度定义为交叉熵损失的指数。

代码示例:计算困惑度

import torch
import torch.nn.functional as F# 假设我们有一个模型的输出logits和真实标签
logits = torch.tensor([[0.2, 0.4, 0.1, 0.3], [0.1, 0.5, 0.2, 0.2]])
labels = torch.tensor([1, 2])# 计算交叉熵损失
loss = F.cross_entropy(logits, labels)# 计算困惑度
perplexity = torch.exp(loss).item()print(f'Cross Entropy Loss: {loss.item()}')
print(f'Perplexity: {perplexity}')
# Output: Cross Entropy Loss: 1.4068
#         Perplexity: 4.0852

BLEU 分数

BLEU(Bilingual Evaluation Understudy)分数常用于机器翻译和文本生成任务,用于衡量生成文本与参考文本之间的相似度。

代码示例:计算BLEU分数

from nltk.translate.bleu_score import sentence_bleureference = [['this', 'is', 'a', 'test'], ['this', 'is' 'test']]
candidate = ['this', 'is', 'a', 'test']
score = sentence_bleu(reference, candidate)print(f'BLEU score: {score}')
# Output: BLEU score: 1.0

ROUGE 分数

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)是用于自动摘要和机器翻译等任务的一组评价指标。

代码示例:计算ROUGE分数

from rouge import Rouge rouge = Rouge()hypothesis = "the #### transcript is a written version of each day 's cnn student news program use this transcript to he    lp students with reading comprehension and vocabulary use the weekly newsquiz to test your knowledge of storie s you     saw on cnn student news"
reference = "this page includes the show transcript use the transcript to help students with reading comprehension and     vocabulary at the bottom of the page , comment for a chance to be mentioned on cnn student news . you must be a teac    her or a student age # # or older to request a chance to be mentioned on cnn student news ."scores = rouge.get_scores(hypothesis, reference)print(f'ROUGE scores: {scores}')
# Output: ROUGE scores: [{'rouge-1': {'f': 0.47, 'p': 0.8, 'r': 0.35}, 'rouge-2': {'f': 0.04, 'p': 0.09, 'r': 0.03}, 'rouge-l': {'f': 0.27, 'p': 0.6, 'r': 0.2}}]


其他评价指标

除了前文提到的困惑度(Perplexity)、BLEU 分数和 ROUGE 分数,还有其他多种评价指标用于衡量语言模型的性能。这些指标可能针对特定的任务或问题而设计,如文本分类、命名实体识别(NER)或情感分析等。本部分将介绍几种其他常用的评价指标,包括精确度(Precision)、召回率(Recall)和 F1 分数。

精确度(Precision)

精确度用于衡量模型识别为正例的样本中,有多少是真正的正例。

代码示例:计算精确度

from sklearn.metrics import precision_score# 真实标签和预测标签
y_true = [0, 1, 1, 1, 0, 1]
y_pred = [0, 0, 1, 1, 0, 1]# 计算精确度
precision = precision_score(y_true, y_pred)print(f'Precision: {precision}')
# Output: Precision: 1.0

召回率(Recall)

召回率用于衡量所有真正的正例中,有多少被模型正确地识别出来。

代码示例:计算召回率

from sklearn.metrics import recall_score# 计算召回率
recall = recall_score(y_true, y_pred)print(f'Recall: {recall}')
# Output: Recall: 0.8

F1 分数

F1 分数是精确度和召回率的调和平均,用于同时考虑精确度和召回率。

代码示例:计算 F1 分数

from sklearn.metrics import f1_score# 计算 F1 分数
f1 = f1_score(y_true, y_pred)print(f'F1 Score: {f1}')
# Output: F1 Score: 0.888888888888889

AUC-ROC 曲线

AUC-ROC(Area Under the Receiver Operating Characteristic Curve)是一种用于二分类问题的性能度量,表达模型对正例和负例的分类能力。

代码示例:计算 AUC-ROC

from sklearn.metrics import roc_auc_score# 预测概率
y_probs = [0.1, 0.4, 0.35, 0.8]# 计算 AUC-ROC
roc_auc = roc_auc_score(y_true, y_probs)print(f'AUC-ROC: {roc_auc}')
# Output: AUC-ROC: 0.8333333333333333

评估语言模型的性能不仅限于单一的指标。根据不同的应用场景和需求,可能需要组合多种指标以得到更全面的评估。因此,熟悉和理解这些评价指标对于构建和优化高效的语言模型至关重要。


总结

语言模型是自然语言处理(NLP)和人工智能(AI)领域中一个非常核心的组件,其在多种任务和应用场景中起到关键作用。随着深度学习技术的发展,特别是像 Transformer 这样的模型结构的出现,语言模型的能力得到了显著提升。这一进展不仅推动了基础研究,也极大地促进了产业的商业化应用。评估语言模型的性能是一个复杂且多层次的问题。一方面,像困惑度、BLEU 分数和 ROUGE 分数这样的传统指标在某些情境下可能不足以反映模型的全面性能。另一方面,精确度、召回率、F1 分数和 AUC-ROC 等指标虽然在特定任务如文本分类、情感分析或命名实体识别(NER)等方面具有很强的针对性,但它们也不总是适用于所有场景。因此,在评估语言模型时,我们应该采取多维度、多角度的评估策略,综合不同的评价指标来获取更全面、更深入的理解。

文章转载自:techlead_krischang

原文链接:https://www.cnblogs.com/xfuture/p/17828837.html

相关文章:

一文解码语言模型:语言模型的原理、实战与评估

在本文中&#xff0c;我们深入探讨了语言模型的内部工作机制&#xff0c;从基础模型到大规模的变种&#xff0c;并分析了各种评价指标的优缺点。文章通过代码示例、算法细节和最新研究&#xff0c;提供了一份全面而深入的视角&#xff0c;旨在帮助读者更准确地理解和评估语言模…...

【C++11】shared_ptr智能指针使用详解

系列文章目录 【C11】智能指针与动态内存 文章目录 系列文章目录简介一、头文件二、初始化1. make_shared2. 拷贝和赋值 三、实例 简介 shared_ptr 是一个类的模板&#xff0c;它使用引用计数的方式来管理一个动态分配的内存资源。shared_ptr 需要一个动态分配的对象时&#…...

JavaScript对象

在JavaScript中&#xff0c;对象是一种非常重要的数据类型。它们允许我们组织和存储相关的数据&#xff0c;并提供了一种灵活的方式来操作和访问这些数据。本文将介绍JavaScript对象的基本概念&#xff0c;包括创建对象、访问对象属性、对象的方法和构造函数&#xff0c;以及原…...

HTML5中自定义数据属性data-*属性(3)jq如何操作data-*

HTML5中自定义数据属性(1)data-*属性(1)data-*属性的使用HTML5中自定义数据属性(2)&#xff1a;data-*的使用HTML5中自定义数据属性data-属性(3)jq如何操作data- 在 jQuery 中&#xff0c;可以使用 data() 方法来获取 data-* 属性的值。这个方法可以读取或设置 HTML 元素上的 …...

C#中.NET Framework4.8 Windows窗体应用通过EF访问新建数据库

目录 一、 操作步骤 二、编写EF模型和数据库上下文 三、 移植&#xff08;Migrations&#xff09;数据库 四、编写应用程序 五、生成效果 前文已经说过.NET Framework4.8 控制台应用通过EF访问已经建立的和新建的数据库。 本文想说的是&#xff0c;.NET Framework4.8 Win…...

LuatOS-SOC接口文档(air780E)--pack - 打包和解包格式串

pack.unpack( string, format, init) 解包字符串 参数 传入值类型 解释 string 需解包的字符串 string 格式化符号 ‘<’:设为小端编码 ‘>’:设为大端编码 ‘’:大小端遵循本地设置 ‘z’:空字符串 ‘p’:byte字符串 ‘P’:word字符串 ‘a’:size_t字符串 ‘A’:…...

认知升级:模型与范式转换

你好&#xff0c;我是 EarlGrey&#xff0c;一名双语学习者&#xff0c;会一点编程&#xff0c;目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 点击上方蓝字关注我&#xff0c;持续获取编程干货、好书推荐和高效工具分享&#xff0c;一起提升认知和思维…...

【2021集创赛】Arm杯一等奖作品—基于 Cortex-M3 内核 SOC 的动目标检测与跟踪系统

本作品介绍参与极术社区的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~ 团队介绍 参赛单位&#xff1a;北京理工大学 队伍名称&#xff1a;飞虎队 指导老师&#xff1a;李彬 参赛杯赛&#xff1a;Arm杯 参赛人员&#xff1a;余裕鑫 胡涵谦 刘鹏昀 获奖情况&#xff1…...

无线WiFi安全渗透与攻防(一) 无线安全环境搭建以及密码生成

无线WiFi安全渗透与攻防 一. 无线安全环境搭建1.802.11标准(1).概念(2). 802.11标准和补充2.WiFi标准3.无线接入点AP(Access Point)1.概念2.AP的分类(1).胖AP(2).瘦AP(3).用途的区别4.客户端 STA5.无线局域网AP术语介绍6.无线网卡的工作模式(1).Managed Mode(2).…...

Windows 11 设置 wsl-ubuntu 使用桥接网络

Windows 11 设置 wsl-ubuntu 使用桥接网络 0. 背景1. Windows 11 下启用 Hyper-V2. 使用 Hyper-V 虚拟交换机管理器创建虚拟网络3. 创建 .wslconfig 文件4. 配置 wsl.conf 文件5. 配置 wsl-network.conf 文件6. 创建 00-wsl2.yaml7. 安装 net-tools 和 openssh-server 0. 背景 …...

Java排序算法之归并排序

图解 归并排序是一种效率比较高的分治排序算法&#xff0c;主要分为两个步骤&#xff0c;分别为“分”和“并”。 分&#xff1a;将序列不断二分&#xff0c;直到每个子序列只有一个元素为止。 并&#xff1a;将相邻两个子序列进行合并&#xff0c;合并时比较两个子序列的元素…...

【Phoenix】请求的生命周期

本文的目的是讨论Phoenix请求的生命周期。我们实战添加两个新的页面&#xff0c;并讨论整个过程是如何串起来的。 让我们从添加第一个新页面开始。 添加一个新页面 web应用通常通过将HTTP方法和路径映射到应用的某个函数来处理请求。Phoenix通过路由器来实现这个匹配。例如将…...

Ps:利用 AI 技术创建人像皮肤图层蒙版

Photoshop 并没有提供专门选择人像皮肤的工具或命令&#xff08;色彩范围中的肤色选择非常不精准&#xff09;&#xff0c;但较新版的 Camera Raw 滤镜则提供了基于 AI 技术的选择人物并创建面部和身体皮肤蒙版的功能。 如果能将 Camera Raw 滤镜中创建的 AI 皮肤蒙版转换成 Ps…...

内存泄漏、new、delete

1. 内存泄漏 内存泄漏&#xff1a;指针被销毁&#xff0c;指针指向的空间依旧存在 2. new过程 与内存分配、构造函数有关 1&#xff09;分配空间&#xff1a;void* mem operator new( sizeof( ) )&#xff0c;内部调用malloc 2&#xff09;static_cast<目标类型>(mem) …...

php在线审稿系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 php在线审稿系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php在线审稿系统 代码 https://download.csdn.net/download/qq_41221322/885…...

【华为HCIP | 华为数通工程师】ISIS 高频题(1)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…...

Netty+SpringBoot 打造一个 TCP 长连接通讯方案

项目背景 最近公司某物联网项目需要使用socket长连接进行消息通讯&#xff0c;捣鼓了一版代码上线&#xff0c;结果BUG不断&#xff0c;本猿寝食难安&#xff0c;于是求助度娘&#xff0c;数日未眠项目终于平稳运行了&#xff0c;本着开源共享的精神&#xff0c;本猿把项目代码…...

2023.11.15 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态路径分析

目录 一、题目 二、解决方法 三、改进 一、题目 背景&#xff1a; 在一个城市中&#xff0c;有数个交通节点&#xff0c;每个节点间有双向道路相连。每条道路具有一个初始权重&#xff0c;代表通行该路段的成本&#xff08;例如时间、费用等&#xff09;。随着时间的变化&am…...

【libGDX】初识libGDX

1 前言 libGDX 是一个开源且跨平台的 Java 游戏开发框架&#xff0c;于 2010 年 3 月 11 日推出 0.1 版本&#xff0c;它通过 OpenGL ES 2.0/3.0 渲染图像&#xff0c;支持 Windows、Linux、macOS、Android、iOS、Web 等平台&#xff0c;提供了统一的 API&#xff0c;用户只需要…...

VIVADO+FPGA调试记录

vivadoFPGA调试记录 vitis编译vivado导出的硬件平台&#xff0c;提示xxxx.h file cant find vitis编译vivado导出的硬件平台&#xff0c;提示’xxxx.h file cant find’ 此硬件平台中&#xff0c;包含有AXI接口类型的ip。在vitis编译硬件平台时&#xff0c;经常会报错&#xf…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

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

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...

运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.

报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符&#xff0c;最后运行&#xff1a;npm run lint --fix...