泛读笔记:从Word2Vec到BERT

自然语言处理(NLP)模型的发展历史

1.统计方法时期:使用贝叶斯方法、隐马尔可夫模型、概率模型等传统统计方法
2.机器学习时期:支持向量机(SVM)、决策树模型、随机森林、朴素贝叶斯等传统机器学习方法
3.深度学习革命:各种新的深度学习模型,比如CNN、RNN(以及变体LSTM、GRU)
4.Transformer架构:提出的Self-Attention机制可以更好的捕捉长距离依赖问题,同时该架构允许并行处理元素,极大的提高了训练速度
5.预训练模型:随着Bert模型的发布,预训练成为了NLP的一个新标准。这些模型首先在一个大规模语料库上进行无监督预训练,然后针对具体任务进行微调,例如GPT系列

1 从NNLM到word2Vec

NNLM(Neural Network Language Model):最早尝试使用神经网络来预测序列中下一个词的概率的模型之一

  • 通过一个连续的词向量空间来表示词,使得相似的词在向量空间中距离较近。
  • 将前几个词的词向量作为输入,并通过一个隐藏层来预测下一个词。
  • 引入了softmax函数来计算每个词的概率分布。

Word2Vec:一种词嵌入技术,即把每个词映射到一个固定大小的向量空间中。

1.1 从向量表示到词嵌入

假设我们对求职人员进行人格测试,会给一个人的很多维度进行打分,内向/外向是其中之一,然后用0~100(内向→外向)来表示程度,假设有一个叫Jay的人得分为38/100,则可以用下图表示该得分:
在这里插入图片描述
为了更好的表达数据,我们将范围压缩至-1到1(类似归一化):
在这里插入图片描述
对于一个人,一个维度显然不足,我们再加一个得分作为第二维度:
在这里插入图片描述
我们就可以认为这个人的性格被这个向量表示出来了,假设我们想找的另一个和Jay性格相仿的人,则可使用该表示法进行比较。
在这里插入图片描述
由图可得,Person #1更合适,但如果是三维、四维或者更高维,则可以使用余弦相似度公式进行计算
在这里插入图片描述
以上述例子计算得
在这里插入图片描述
也可得出Person #1更合适,这就是将性格向量化,对于字词也是同样得,我们可以将词向量化,而生成词向量(Word Vectors) 的具体方法就是词嵌入(Word Embeddings) ,词嵌入是指将单词映射到一个稠密的向量空间中的过程,其中的每个维度都代表了某种语言特征。

这里以GloVe向量为例,它是一种用于生成词向量的方法,下面是的单词’king’的词嵌入:
[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 , -0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 , 0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344 , -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]

根据它们的值对单元格进行颜色编码(如果它们接近2则为红色,接近0则为白色,接近-2则为蓝色):
在这里插入图片描述

然后将’king’与其他单词进行比较
在这里插入图片描述
可以明显看到’Man’和’Woman’更相似,即该词嵌入很好的展示了单词的联系,下面再举一个例子:
在这里插入图片描述
大家可以根据色条的相似度,得出不同词之间的相似情况。

1.2 NNLM模型

NNLM的核心是一个多层感知机,它将词向量序列映射到一个固定长度的向量表示,然后将这个向量输入到一个softmax层中,计算出下一个词的概率分布,假设我们输入’Thou shalt’,然后该模型会按下面三个步骤进行预测:
在这里插入图片描述
最后’not’的得分最高,所以选择向用户推荐’not’。

其中Look up Embedding,由于模型在经过另外一个训练之后可以生成一个映射单词表所有单词的矩阵,也称词嵌入矩阵,从而在进行预测的时候,我们可以在这个词嵌入矩阵中查询输入的单词。

1.2.1 如何构建词嵌入矩阵

首先收集大量的文本数据,然后建立一个滑动窗口(滑动窗口的大小可以自定义),构建滑动窗口内+滑动窗口后一个单词的训练+预测样本,就可以得到一套用于训练用的数据集
在这里插入图片描述
下面是数据集,即不同的单词组合后面会出现的单词:
在这里插入图片描述

1.3 Word2Vec的两种架构:CBOW和Skipgram

CBOW: 为了更好的预测,不仅要考虑目标单词的前两个单词,还要考虑其后两个单词,这种通过“通过上下文词汇预测当前词”的架构就是连续词袋(CBOW)

Skipgram: 根据当前词推测当前单词的前后单词的架构就是Skipgram

1.4 Word2vec训练流程

  1. 首先创建两个矩阵:词嵌入Embedding矩阵(是网络Onehot层到Embedding层映射的网络参数矩阵,相当于一个初始化的Embedding矩阵)、上下文Context矩阵
  2. 前向传播:将上下文词的词向量求平均或相加,形成一个上下文向量,将上下文向量乘以一个权重矩阵(通常称为输出权重矩阵),并通过softmax函数计算每个词作为中心词的概率分布。
  3. 损失计算:计算预测的概率分布与真实标签(中心词的真实索引)之间的交叉熵损失。
  4. 反向传播:利用损失函数的梯度更新词向量矩阵和输出权重矩阵。
  5. 迭代重复

训练结束后,会得到一个全新的词嵌入Embedding矩阵,并用于之后的预测

2 从Seq2Seq到Seq2Seq with Attention

2.1 Seq2Seq(Sequence-to-sequence)

字面意思:输入一个序列,输出另一个序列

2.1.1 Encoder-Decoder模型

特别适用于序列到序列(seq2seq)的任务,如机器翻译、文本摘要、对话系统等。

  • 编码器(Encoder):编码器负责读取输入序列,并将其转换为一个固定长度的向量,这个向量被称为“上下文向量”或“编码向量”。编码器通常是一个递归神经网络(RNN),它可以逐个元素地处理输入序列,并生成一个状态向量,最终状态向量就是编码向量。

  • 解码器(Decoder):解码器接收编码器产生的上下文向量,并根据这个向量生成输出序列。解码器也是一个RNN,它通过逐个元素地生成输出序列中的元素,每次生成一个新元素时都会考虑到之前的状态和编码向量。

在这里插入图片描述

2.2 Attention机制

Encoder-Decoder模型有一个缺陷,序列较长时,所有语义完全转换为一个中间语义向量C来表示,可能会丢失许多信息,而Attention机制就让Eecoder 不再将整个输入序列编码为固定长度的「中间向量C」,而是编码成一个向量的序列(包含多个向量)。
在这里插入图片描述

Attention机制通过计算输入序列中各个部分与当前任务的相关性,从而为每个部分分配一个权重,这些权重反映了各个部分对当前任务的重要性
在这里插入图片描述

假设图书馆(source)里有很多书(value),为了方便查找,我们给书做了编号(key)。当我们想要了解漫威(query)的时候,我们就可以看看那些动漫、电影、甚至二战(美国队长)相关的书籍。
在这里插入图片描述
计算步骤

  1. 计算query和key的点积,得到权值
  2. 将权值归一化,即将原始计算分值整理成所有元素权重之和为1的概率分布,或者说通过SoftMax的内在机制更加突出重要元素的权重
  3. 将权重和 value 进行加权求和

最后便会得到一个Attention值,反应某元素对该任务的重要性。

2.2.1 举例说明Attention的计算步骤

假设输入为:The cat is sitting on the mat
我们想将该句子翻译为中文,步骤如下

  1. 将句子转化为词嵌入向量序列(Embedding Vectors)
  2. 输入到Encoder中,Encoder会计算每个输入词的隐藏状态 h i h_{i} hi i i i表示在输入序列中的位置
  3. 初始化解码器状态,假设要生成第一个词“这”(对应“The”),解码器会根据编码器的最后一个隐藏状态或所有隐藏状态的一个加权平均和来初始化解码器的状态,该初始状态包含了整个输入句子的信息
  4. attention机制,计算注意力得分、使用softmax函数将得分转化为注意力权重,这些权重决定了输入序列中的哪些位置最重要
  5. 计算上下文向量,使用注意力权重来加权求和所有Encoder隐藏状态
  6. 结合上下文向量和解码器的状态(通常是拼接),再输入到一个前馈神经网络,最后会得到一个输出词汇的概率分布表,选取概率最高的输入
  7. 重复该步骤,直到所有词汇翻译完毕

3 Transformer架构

3.1 Transformer编码

Transformer的提出即是为了更好的解决机器翻译问题,下面是一个简单步骤说明:
在这里插入图片描述

一个输入句子经过Transformer后,会被翻译成另一个句子,我们聚焦于中的模型:
在这里插入图片描述
其中:

  1. 编码组件部分由一堆Encoder构成(具体个数可以调)
  2. 解码组件部分也是由相同数量的Decoder组成

在这里插入图片描述
然后我们再聚焦于单个编码器和解码器:
在这里插入图片描述
步骤如下:

  1. 句子输入到编码器后,经过self-attention层,会帮助编码器在对每个单词编码时关注输入句子中的的其他单词,即可以捕捉到输入句子中词语之间的关系,而不仅仅是相邻的词。
  2. 然后传入前馈神经网络,进行特征提取
  3. 流入解码器,解码器也有self-attention层,但用于处理输出序列;编码-解码注意力层许解码器关注编码器的输出,帮助模型确定输入句子中最相关的部分,从而提高翻译的准确性;最后传入前馈神经网络,进行特征提取然后输出

3.1.2 举例说明

1.首先将每个输入词转化为词向量(这里的维度是演示作用,实际中可以自己调整)
在这里插入图片描述

2.输入到解码器中
在这里插入图片描述
便发现了Transformer的两个特点:

  1. 每个单词都是单独流入编码器,而不是排队进入
  2. 在前馈神经网络中,计算是独立的,即可以并行计算

3.2 Self-attention机制

假定现在要翻译下列句子:
“The animal didn’t cross the street because it was too tired”,那其中的it是指animal还是street呢?对人很容易,但对算法很难
但通过self-attention机制后,模型会得出itanimal更相关
在这里插入图片描述

3.3 self-attention计算方法

3.4 求和归一化

Transformer架构中,还需再提一下编码器中的一个细节:每个编码器中的每个子层都有一个残差连接,然后做了一个:层归一化(layer-normalization)
在这里插入图片描述
残差连接 (Residual Connection):残差连接引入了跳跃连接的思想,使得输入可以直接绕过一层或多层传递到后面的层。这种连接有助于缓解深层网络中的梯度消失/爆炸问题,并促进信息和梯度的流动。
层归一化 (Layer Normalization):层归一化是在神经网络层中对激活值进行归一化的技术,它可以帮助控制每一层的输出的统计特性(均值和方差),从而减少内部协变量移位(internal covariate shift),使得训练更加稳定。

3.5 解码器中的两个注意力层

我们观察解码器,会发现其中有两个注意力层
在这里插入图片描述

  1. 一个带masked的Multi-Head Attention,本质是Self-Attention,该自注意力层只允许关注已输出位置的信息,屏蔽了未输出的信息。
    例如在翻译“我是学生”为“I am a student”的过程中,当解码器开始生成“I”时,它只能看到自己之前生成的词(在这里是起始标记),而不能看到后续的任何词。

  2. 一个不带masked的Multi-Head Attention,即Encoder-Decoder Attention,这个注意力层允许解码器关注编码器产生的表示,以找到输入序列中与当前生成的输出最相关的部分。这有助于解码器在生成每个词时,能够利用到整个输入句子的信息。
    例如在翻译“我是学生”为“I am a student”的过程中,当解码器生成“I”时,它不仅会考虑之前生成的词,还会通过编码器-解码器注意力层去关注输入序列“我是学生”中的相关信息,从而更好地生成下一个词。

  3. List item

3.6 最后的线性层和softmax层

它们的作用是把Decoder输出的浮点型向量,变成一个

假设我们的模型词汇表是10000个英语单词,它们是从训练数据集中学习的。那logits向量维数也是10000,每一维对应一个单词的分数。然后,softmax层将这些分数转化为概率(全部为正值,加起来等于1.0),选择其中概率最大的位置的词汇作为当前时间步的输出。

4 BERT模型

4.1 从Word Embedding到ELMO

4.1.1 Word Embedding的缺陷

在第一部分中,介绍了word2vec技术,作为Word Embedding的一类,它也存在Word Embedding的一些缺陷,便是无法处理多义词问题

4.1.2 ELMo(Embedding from Language Models)

是一种创新的词嵌入方法,它通过语言模型来生成词向量,特别之处在于它能够提供上下文相关的词表示,有着以下特点:

  1. 上下文敏感性: 与传统的词嵌入方法(如Word2Vec或GloVe)不同,ELMo为每个词生成的向量不是固定的,而是取决于该词出现的上下文。这意味着同一个词在不同的句子中可能会有不同的向量表示,这更符合自然语言的真实使用情况。
  2. 双向语言模型: ELMo 使用了两个长短期记忆网络(LSTM)作为语言模型,一个正向LSTM(从左到右读取文本),一个反向LSTM(从右到左读取文本)。通过结合这两种方向的语言模型,ELMo能够捕捉到词在句子中的前后关系。
  3. 层次结构: ELMo的LSTM语言模型有多层,每一层都可以捕获不同粒度的语义信息。最终的词嵌入是这些层的加权平均,这使得ELMo能够综合考虑局部和全局的上下文信息。

一个句子通过ELMo之后会得到三个Embedding,如下图所示:
在这里插入图片描述
假设我们将“i am a student”翻译为“我是学生”

  1. 预训练阶段: ELMo 需要在大量未标注的文本数据上进行预训练,以生成上下文敏感的词向量。输入“i am a student”,会分别通过正向和反向LSTM,去获得每个词基于前面词/后面词的概率分布。
  2. 第一个Embedding,是单词的Word Embedding
  3. 第二个Embedding,是双层双向LSTM中第一层LSTM对应单词位置的Embedding,这层编码单词的句法信息更多一些
  4. 第三个Embedding,是双层双向LSTM中第二层LSTM对应单词位置的Embedding,这层编码单词的语义信息更多一些

通过ELMo生成的词向量,比传统的词嵌入技术(如 Word2Vec 或 GloVe)更具有动态性和语境适应性,因此在输入到分类/预测模型中之后,会有更好的效果。

4.2 微调(Fine-tuning)

把在源数据集上训练的源模型的能力迁移到新数据新模型上

迁移学习(Transfer learning) ,就是把已训练好的模型(预训练模型)参数迁移到新的模型来帮助新模型训练。现迁移学习有以下三种手段:

  1. Transfer Learning:冻结预训练模型的全部卷积层,只训练自己定制的全连接层
  2. Extract Feature Vector: 先计算出预训练模型的卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络
  3. Fine-tuning:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层,因为这些层保留了大量底层信息)甚至不冻结任何网络层,训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层

假设我们想从图像中识别出不同种类的椅子,然后将购买链接推荐给用户。一种可能的方法是:

先找出100种常见的椅子,为每种椅子拍摄1,000张不同角度的图像,便收集到的10万张图像数据集(目标数据集)

  1. 在源数据集(如ImageNet数据集)上预训练一个神经网络模型,即源模型
  2. 创建一个新的神经网络模型,即目标模型,它复制了源模型上除了输出层外的所有模型设计及其参数,我们假设这些模型参数包含了源数据集上学习到的知识,且这些知识同样适用于目标数据集,我们还假设源模型的输出层与源数据集的标签紧密相关,因此在目标模型中不予采用。
  3. 为目标模型添加一个输出大小为目标数据集类别个数的输出层,并随机初始化该层的模型参数
  4. 目标数据集上训练目标模型,我们将从头训练输出层,而其余层的参数都是基于源模型的参数微调得到的

在这里插入图片描述

4.3 生成式的预训练之GPT:预训练(单向Transformer) + Fine-tuning

ELMo方法使用的是LSTM去提取数据特征,但随着Transformer的出现,它的特征抽取能力要强于LSTM,所以特征提取自然就采用了Transformer,但它采用的是单向Transformer
在这里插入图片描述

4.3.1 为什么要采用单向transformer呢?

GPT使用的Transformer结构就是将Encoder中的Self-Attention替换成了Masked Self-Attention,即屏蔽了未输出的词,理由如下:

  1. 生成连贯的文本序列。
  2. 避免信息泄露,即模型不会提前知道它还没有生成的信息。

4.4 BERT:双向Transformer版的GPT

4.4.1 BERT模型的架构:预训练(双向Transformer) + Fine-Tuning

即BERT模型综合了ELMo的双向优势和Transformer的特征提取优势

下图是BERT、GPT、ELMo的结构图对比:
在这里插入图片描述

4.4.2 BERT对输入、输出部分的处理

为了适配多任务下的迁移学习,BERT设计了更通用的输入层和输出层。

BERT的输入部分是个线性序列,两个句子之间通过分隔符「SEP」分割,最前面是起始标识「CLS」,每个单词有三个embedding:

  1. 单词embedding,有的单词会拆分成一组有限的公共子词单元,例如下图示例中‘playing’被拆分成了‘play’和‘ing’
  2. 句子embedding,用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)
  3. 位置信息embedding,句子有前后顺序

在这里插入图片描述

把单词对应的三个embedding相加,就形成了BERT的输入。

BERT在预训练的输出部分如参考下图:
在这里插入图片描述

4.4.3 BERT的创新点

  1. 掩码语言模型(Masked Language Model, MLM):在训练过程中,输入的一段文本会被随机地遮盖一部分词汇(通常大约15%的词汇会被遮盖)。这些被遮盖的词汇将被特殊标记(如[MASK])替换,能更好地捕捉到词汇的多义性和上下文依赖性。
  2. 下一句预测(Next Sentence Prediction, NSP):即判断句子B是否是句子A的下文,这个关系保存在BERT输入表示图中的[CLS]符号中,通过NSP任务,BERT模型可以学到句子级别的上下文关系

参考文献

ransformer通俗笔记:从Word2Vec、Seq2Seq逐步理解到GPT、BERT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/430220.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyExcel的基本使用——Java导入Excel数据

使用EasyExcel导入Excel数据有两种方式 无论哪种方式我们都需要建立Excel表格和Java对象的绑定 首先我们需要根据Excel表头定义一个对应的类 excel表示例: 对应的类: 使用ExcelProperty将excel列名和字段名绑定,括号里面填列名 package co…

GPU加速生物信息分析的尝试

GPU工具分类 实话实说,暂时只有英伟达的GPU才能实现比较方便的基因组分析集成化解决方案,其他卡还需要努力呀,或者需要商业公司或学术团体的努力开发呀!FPGA等这种专用卡的解决方案也是有的,比如某测序仪厂家&#xf…

9月23日

思维导图 作业 统计家目录下.c文件的个数 #!/bin/bashnum0for file in ~/*.c; doif [ -f "$file" ]; then((num))fi doneecho "家目录下.c文件的个数: $num"

HTML5 Video标签的属性、方法和事件汇总,以及常用视频插件推荐

🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

第4步CentOS配置SSH服务用SSH终端XShell等连接方便文件上传或其它操作

宿主机的VM安装CENTOS文件无法快速上传,也不方便输入命令行,用SSH终端xshell连接虚拟机的SSH工具就方便多了,实现VM所在宿主机Win10上的xshell能连接vm的centos要实现以下几个环节 1、确保宿主机与虚拟机的连通性。 2、虚拟机安装SSH服务&…

在SpringCloud中实现服务熔断与降级,保障系统稳定性

在分布式系统中,微服务架构的应用越来越受欢迎。然而,由于各个微服务之间的依赖关系和网络通信的不稳定性,一个不稳定的服务可能会对整个系统产生连锁反应,导致系统崩溃。为了保障系统的稳定性,我们需要一种机制来处理…

PHP基础语法讲解

​ 大家好,我是程序员小羊! 前言: PHP(Hypertext Preprocessor)是一种常用于网页开发的服务器端脚本语言,易于学习并且与 HTML 紧密结合。以下是 PHP 的基础语法详细讲解。 1. PHP 基础结构 1.1 PHP 脚本结…

探索AutoIt:自动化任务的Python魔法棒!

文章目录 探索AutoIt:自动化任务的Python魔法棒!背景:为什么选择AutoIt?AutoIt库简介安装AutoIt库简单的库函数使用方法场景应用常见Bug及解决方案总结 探索AutoIt:自动化任务的Python魔法棒! 背景&#x…

深度学习02-pytorch-06-张量的形状操作

在 PyTorch 中,张量的形状操作是非常重要的,可以让你灵活地调整和处理张量的维度和数据结构。以下是一些常用的张量形状函数及其用法,带有详细解释和举例说明: 1. reshape() 功能: 改变张量的形状,但不改变数据的顺序…

玄机靶场--蚁剑流量

木马的连接密码是多少 黑客执行的第一个命令是什么 id 黑客读取了哪个文件的内容,提交文件绝对路径 /etc/passwd 黑客上传了什么文件到服务器,提交文件名 黑客上传的文件内容是什么 黑客下载了哪个文件,提交文件绝对路径 蚁剑流量特征总结 …

移动开发(三):使用.NET MAUI打包第一个安卓APK完整过程

目录 一、修改AndroidManifest.xml 配置APP基本信息权限 二、修改项目属性调整输出Android包格式为APK 三、项目发布 四、APP分发 五、总结 之前给大家介绍过使用使用.NET MAUI开发第一个安卓APP,今天给大家介绍如何打包成APK,然后安装到安卓手机正常运行。这里还是沿用…

基于springboot的驾校预约管理系统的设计与实现 (含源码+sql+视频导入教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的驾校预约管理系统5拥有三种角色:管理员、教练、学员 管理员:学员管理、教练管理、车辆管理、车辆关联、维修管理等 教练:学员查看/毕…

脱离枯燥的CRUD,灵活使用Mybatis,根据mybatis动态的xml片段和接口规范动态生成代理类,轻松应付简单业务场景。

需求 需求是这样的,我们有一个数据服务平台的产品,用户先将数据源信息保存到平台上,一个数据源可以提供多个接口服务,而每个接口服务在数据库中存一个具有mybatis语法的sql片段。这样的话,对于一些简单的业务只需要编…

电力施工作业安全行为检测图像数据集

电力施工作业安全行为检测图像数据集,图片总共 2300左右,标注为voc(xml)格式,包含高空抛物,未佩戴安全带,高处作业无人监护等。 电力施工作业安全行为检测图像数据集 数据集描述 这是一个专门用于电力施工作业安全行…

Drive.js 的一些 Api 使用记录

文章目录 2024 年 drive.js 的基础使用想在下一步的时候处理些逻辑呢?(同步)Element 的各种选择器 2024 年 drive.js 的基础使用 安装就跳过了 npm install driver.js ,一行代码就可以搞定 官网的 Basic Usage 基础使用的截图如下: 想在下…

SLAM实操入门(八):使用Robosence-16转换数据格式,进行基于A-Loam的三维SLAM

文章目录 前言1 Robosence与Velodyne格式差异.2 格式转换2.1 rs_to_velodyne库2.2 目前支持: 3 拉取工程并编译2.1 安装robosence雷达驱动(类似第六章):2.2 构建rs2vel工程: 3 运行robosence雷达,并转换格式…

2012年408考研真题-数据结构

8.【2012统考真题】求整数n(n≥0)的阶乘的算法如下&#xff0c;其时间复杂度是(&#xff09;。 int fact(int n){ if(n<1) return 1; return n*fact (n-1); } A. O(log2n) B. O(n) C. O(nlog2n) D. O(n^2) 解析&#xff1a; 观察代码&#xff0c;我们不…

Matlab Simulink 主时间步(major time step)、子时间步(minor time step)

高亮颜色说明&#xff1a;突出重点 个人觉得&#xff0c;&#xff1a;待核准个人观点是否有误 高亮颜色超链接 文章目录 对Simulink 时间步的理解Simulink 采样时间的类型Discrete Sample Times(离散采样时间)Controllable Sample Time(可控采样时间) Continuous Sample Times(…

在MAC中Ollama开放其他电脑访问

ollama安装完毕后默认只能在本地访问&#xff0c;之前我都是安装其他的软件之后可以结合开放其他端口访问&#xff0c;其实是可以新增或修改下电脑的系统配置&#xff0c;就可以打开端口允许除本机IP或localhost访问。 步骤如下&#xff1a; 1、查看端口&#xff08;默认是&…

Shelly实测天工的音乐创作功能,写了一首歌,来听听效果

​ 大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 在数字时代的洪流中&#xff0c;我始终…