当前位置: 首页 > 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…...

Android——Gradle插件gradle-wrapper.properties

一、Android Studio版本&#xff0c;Android Gradle插件版本&#xff0c;Gradle版本 Android Studio 通过Android Gradle插件 使用 Gradle来构建代码&#xff1b; Android Studio每次升级后&#xff0c; Android Gradle 插件自动更新&#xff0c;对应的Gradle版本也会变动&…...

iOS应用加固方案解析:ipa加固安全技术全面评测

在移动应用开发领域&#xff0c;iOS应用的安全性一直备受关注。ipaguard作为一款专业的iOS应用加固方案&#xff0c;采用混淆加密技术&#xff0c;旨在保护应用免受破解、逆向和篡改等风险。本文将深入探讨ipaguard的产品功能、安全技术及其在iOS应用加固领域中的核心优势和特色…...

过滤器模式 rust和java的实现

文章目录 过滤器模式实现 过滤器模式实现javarustjavarust rust代码仓库 过滤器模式 过滤器模式&#xff08;Filter Pattern&#xff09;或标准模式&#xff08;Criteria Pattern&#xff09;是一种设计模式&#xff0c;这种模式允许开发人员使用不同的标准来过滤一组对象&…...

Feature Pyramid Networks for Object Detection(2017.4)

文章目录 Abstract1. Introduction3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 7. Conclusion FPN Abstract 特征金字塔是识别系统中检测不同尺度物体的基本组成部分。但最近的深度学习对象检测器避免了金字塔表示&#xff0c;部分…...

Python3基础模块 random

Python3基础模块 random import random #作用&#xff1a;生成随机数使用dir(module)查看模块内容 >>> import random >>> dir(random) [BPF, LOG4, NV_MAGICCONST, RECIP_BPF, Random, SG_MAGICCONST, SystemRandom, TWOPI, _BuiltinMethodType, _MethodT…...

ubuntu安装pgsql16

ubuntu安装postgresSQL 官网地址&#xff1a; https://www.postgresql.org/download/ 1.安装 # 添加源 sudo sh -c echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list # 安装数字签名 w…...

数据管理70个名词解析

数据标准化70个名词解析 1、数据 是指任何以电子或者其他方式对信息的记录。在计算机科学技术中&#xff0c;“数据”是客观事物的符号表示&#xff0c;指所有可被输入到计算机中并可被计算机程序处理的符号的总称;在管理科学技术中&#xff0c;“数据”是描述事件或事物的属性…...

线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换

本系列文章将从下面不同角度解析线性代数的本质&#xff0c;本文是本系列第二篇 向量究竟是什么&#xff1f; 向量的线性组合&#xff0c;基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵&#xff0c;列空间&#xff0c;秩与零空间 克…...

Linux-CentOS重要模块

软件包管理器&#xff1a;CentOS使用Yum&#xff08;Yellowdog Updater, Modified&#xff09;作为其包管理器。Yum提供了一种方便的方式来安装、更新和删除软件包&#xff0c;并自动解决依赖关系。 RPM&#xff1a;RPM&#xff08;RPM Package Manager&#xff09;是CentOS中…...

posix定时器的使用

POSIX定时器是基于POSIX标准定义的一组函数&#xff0c;用于实现在Linux系统中创建和管理定时器。POSIX定时器提供了一种相对较高的精度&#xff0c;可用于实现毫秒级别的定时功能。 POSIX定时器的主要函数包括&#xff1a; timer_create()&#xff1a;用于创建一个定时器对象…...