【每日算法】理论:深度学习基础 刷题:KMP算法思想

上期文章

【每日算法】理论:常见网络架构 刷题:力扣字符串回顾

文章目录

  • 上期文章
  • 一、上期问题
  • 二、本期理论问题
      • 1、注意力机制
      • 2、BatchNorm 和 LayerNorm 的区别
      • 3、Bert 的参数量是怎么决定的。
      • 4、为什么现在的大语言模型都采用Decoder only架构?
      • 5、什么是梯度消失和爆炸
      • 6、梯度消失和梯度爆炸产生的原因
  • 三、力扣刷题回顾-字符串
      • 151.翻转字符串里的单词
      • 右旋字符串
      • KMP算法
      • 28. 实现 strStr()
      • 459.重复的子字符串


一、上期问题

  • clip编码优缺点
  • Torch 和 Tensorflow 的区别
  • RNN
  • 1x1卷积在卷积神经网络中有什么作用
  • AIGC 存在的问题
  • AlexNet

二、本期理论问题

1、注意力机制

注意力机制是一种通过调整输入数据的权重来提高模型性能的方法。它通过给每个输入元素来分配一个权重,以确定该元素对模型输出的贡献程度。权重的分配是通过一个称为“注意力”的函数来计算的,该函数根据输入元素的特征和需求来计算权重。注意力机制的主要目的是将更多的权重分配给与模型目标相关的输入元素,以使模型能够更好地处理这些元素。

2、BatchNorm 和 LayerNorm 的区别

BN(批归一化)和LN(层归一化)都是神经网络中用于正则化的技术,它们的主要区别在于处理的样本和特征维度不同。

  • BN是对一批样本内的每个特征(通道)做归一化。LN是对每个样本的所有特征进行归一化,在层这个维度上去做归一化,它的均值和方差是针对单个样本的所有通道进行计算的。因此,可以简单地将它们看作是横向和纵向的区别。
  • LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对变长的输入sequence的normalize操作。由于NLP中的文本输入一般为变长,所以使用layernorm更好。

归一化总结:BN、LN、IN、GN、SN

3、Bert 的参数量是怎么决定的。

Bert的参数量由其模型结构以及隐藏层的大小、层数等超参数所决定。具体来说,Bert 模型由多个 Transformer Encoder 层组成,每个 Encoder 层包含多个注意力头以及前馈神经网络层。因此,Bert 的参数量主要由这些层的数量、每层的隐藏单元数、注意力头的数量等因素决定。

4、为什么现在的大语言模型都采用Decoder only架构?

大模型从模型架构上主要分为三种:以BERT为代表的Only-encoder、以T5和BART为代表的Encoder-Decoder、以GPT为代表的Only-Decoder,还有以UNILM为代表的PrefixLM(相比于GPT只改了attention mask,前缀部分是双向,后面要生成的部分是单向的causal mask)。

  • 对于BERT这类Only-encoder来说,它使用masked language modeling预训练,不擅长做生成任务,做NLU一般也需要有监督的下游数据微调,相比之下Only-decoder的模型用next token prediction预训练,兼顾理解和生成,在各种下游任务上的zero-shot和few-shot泛化性能都很好。
  • 对于引入了一部分双向attention的Encoder-Decoder和PrefixLM来说,他们虽然也能兼顾理解和生成,但是训练效率和工程实现上不如Only-decoder架构,Only-decoder架构支持一直复用KV-Cache,对多轮对话更加友好。
  • Only-decoder模型整体上的泛化性能是最好的,潜在原因主要有:
    • Encoder的双向注意力存在低秩问题,这可能会削弱模型表达能力,就生成任务而言,引入双向注意力并无实质好处;而casal attention的注意力矩阵式下三角矩阵,必然是满秩的,建模能力更强;
    • 纯粹的Only-decoder架构+next token prediction预训练,每个位置所能接触的信息比其他架构少,要预测下一个token难度更高,当模型足够大、数据足够多的时候,Only-decoder模型学习通用表征的上限更高;
    • casal attention(即Only-decoder的单向attention)具有饮食的位置编码功能,打破了transformer的位置不变形,而带有双向attention的模型,如果不带位置编码,双向attention的部分token可以对换也不改变表示,对语序的区分能力天生较弱。

5、什么是梯度消失和爆炸

梯度消失是指在深度学习训练的过程中,梯度随着 BP 算法中的链式求导逐层传递逐层减小,最后趋近于0,导致对某些层的训练失效;梯度爆炸与梯度消失相反,梯度随着 BP 算法中的链式求导逐层传递逐层增大,最后趋于无穷,导致某些层无法收敛;

6、梯度消失和梯度爆炸产生的原因

出现梯度消失和梯度爆炸的问题主要是因为参数初始化不当以及激活函数选择不当造成的。其根本原因在于反向传播训练法则,前面层上的梯度是来自于后面层上梯度的乘积,属于先天不足。当训练较多层数的模型时,一般会出现梯度消失问题和梯度爆炸问题。

三、力扣刷题回顾-字符串

上期涉及题目:

  • 344.反转字符串
  • 541. 反转字符串II
  • 替换数字

本期题目:

  • 151.翻转字符串里的单词
  • 右旋字符串
  • 28. 实现 strStr()
  • 459.重复的子字符串

151.翻转字符串里的单词:

  • 给定输入:一个字符串 s
  • 要求输出:反转字符串中单词的顺序

右旋字符串:

  • 给定输入:一个字符串 s 和一个正整数 k
  • 要求输出:将字符串中的后面 k 个字符移到字符串的前面

28. 实现 strStr():

  • 给定输入:两个字符串 haystack 和 needle
  • 要求输出:在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标。如果 needle 不是 haystack 的一部分,则返回 -1 。

459.重复的子字符串:

  • 给定输入:一个非空的字符串 s
  • 要求输出:检查是否可以通过由它的一个子串重复多次构成

对比分析:
151.翻转字符串里的单词右旋字符串两道题都是字符串章节较为简单的题目,151.翻转字符串里的单词可以采用双指针的思想解决,右旋字符串使用字符串切片即可。28. 实现 strStr()459.重复的子字符串是两道运用KMP算法的字符串题。KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。


151.翻转字符串里的单词

class Solution:def reverseWords(self, s: str) -> str:lst=s.split()left,right=0,len(lst)-1while left < right:lst[left],lst[right] = lst[right],lst[left]left += 1right -= 1return " ".join(lst)

右旋字符串

k=int(input())
s=input()
left=len(s)-k
right=len(s)
s=s[left:right]+s[:left]
print(s)

KMP算法

  • KMP算法是用来解决字符串匹配的问题: 在一个串中查找是否出现过另一个串。
  • KMP的经典思想: 当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。
  • KMP中记录已经匹配的文本内容的关键是前缀表: 前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。前缀表中下标i对应的值就是记录了下标i之前(包括i)的字符串中有多大长度的相同前缀后缀。
  • 前缀表为什么可以记录下一次匹配的位置:

下标5之前这部分的字符串(也就是字符串aabaa)的最长相等的前缀 和 后缀字符串是 子字符串aa ,因为找到了最长相等的前缀和后缀,匹配失败的位置是后缀子串的后面,那么我们找到与其相同的前缀的后面重新匹配就可以了。
在这里插入图片描述

  • 前缀表的计算:
    长度为前1个字符的子串a,最长相同前后缀的长度为0。(注意字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。)
    在这里插入图片描述
    长度为前2个字符的子串aa,最长相同前后缀的长度为1。
    在这里插入图片描述
    长度为前3个字符的子串aab,最长相同前后缀的长度为0。
    在这里插入图片描述
    以此类推: 长度为前4个字符的子串aaba,最长相同前后缀的长度为1。 长度为前5个字符的子串aabaa,最长相同前后缀的长度为2。 长度为前6个字符的子串aabaaf,最长相同前后缀的长度为0。

那么把求得的最长相同前后缀的长度就是对应前缀表的元素在这里插入图片描述

28. 实现 strStr()

  • 定义next数组(前缀表):
    • 初始化
    • 定义两个指针分别遍历前缀和后缀
    • 然后分别处理前后缀相同和不同的情况
    • 更新next数组的值
  • 进行匹配
    • 获得子串的next数组
    • 定义两个指针分别遍历子串和父串
    • 依次匹配,分别处理匹配成功和匹配不成功的情况
class Solution:def getNext(self,next,s):# 初始化next数组next[0] = 0# 定义两个指针i和j,j指向前缀末尾位置,i指向后缀末尾位置j = 0for i in range(1,len(s)):# 前后缀末尾不相同的情况,就要向前回退while j > 0 and s[i] != s[j]:j = next[j-1]# 前后缀相同时,就同时向后移动i 和jif s[i] == s[j]:j += 1# 将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度next[i] = jdef strStr(self, haystack: str, needle: str) -> int:if len(needle) == 0:return 0next = [0] * len(needle)self.getNext(next,needle)j=0for i in range(len(haystack)):while j > 0 and haystack[i] != needle[j]:j = next[j-1]if haystack[i] == needle[j]:j += 1if j == len(needle):return i-len(needle)+1return -1

459.重复的子字符串

  • 定义next数组(前缀表):
    • 初始化
    • 定义两个指针分别遍历前缀和后缀
    • 然后分别处理前后缀相同和不同的情况
    • 更新next数组的值
  • 进行匹配
    数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环。
class Solution:def getNext(self,next,s):# 初始化next数组next[0] = 0# 定义两个指针i和j,j指向前缀末尾位置,i指向后缀末尾位置j = 0for i in range(1,len(s)):# 前后缀末尾不相同的情况,就要向前回退while j > 0 and s[i] != s[j]:j = next[j-1]# 前后缀相同时,就同时向后移动i 和jif s[i] == s[j]:j += 1# 将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度next[i] = jdef repeatedSubstringPattern(self, s: str) -> bool:if len(s) == 0:return Falsenext = [0]*len(s)self.getNext(next,s)if next[-1] != 0 and len(s)%(len(s)-next[-1]) == 0:return Truereturn False

参考:
代码随想录算法训练营第七天|344.反转字符串,541. 反转字符串II,卡码网:54.替换数字,151.翻转字符串里的单词,卡码网:55.右旋转字符串
代码随想录算法训练营第八天|28. 实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾
为什么现在的LLM都是Decoder only的架构?

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

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

相关文章

第二篇:Python环境搭建:从初学者到专家

Python环境搭建&#xff1a;从初学者到专家 在编程的世界里&#xff0c;准备好一个高效而舒适的开发环境是走向成功的第一步。在这篇博客文章中&#xff0c;我们将一起探索如何为Python编程搭建一个理想的环境。无论你是完全的新手还是希望提升现有的技能&#xff0c;本文都会…

【Python 对接QQ的接口】简单用接口查询【等级/昵称/头像/Q龄/当天在线时长/下一个等级升级需多少天】

文章日期&#xff1a;2024.04.28 使用工具&#xff1a;Python 类型&#xff1a;QQ接口 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xff09;&…

第10章 项目管理基础知识

一、项目概述 &#xff08;一&#xff09;项目 在既定的项目资源要求和约束下&#xff0c;为实现特定目标而相互联系的一次性活动&#xff08;资源任务&#xff09;。世界上没有两个完全相同的项目项目有资源约束&#xff0c;一定的目的&#xff0c;是一次性。 &#xff08;…

金属冶炼及压延加工制造数字孪生可视化平台,推进行业数字化转型

金属冶炼及压延加工制造数字孪生可视化平台&#xff0c;推进行业数字化转型。随着科技的不断进步和工业的快速发展&#xff0c;金属冶炼及压延加工行业正面临着前所未有的挑战和机遇&#xff0c;数字化转型成为了行业发展的必然趋势。在这个过程中&#xff0c;数字孪生可视化平…

OSPF大作业

一&#xff0c;拓扑 二&#xff0c;要求 1&#xff0c;r4为ISP上只配ip&#xff0c;r3与其他设备之间只使用公有IP 2&#xff0c;r3-r5/6/7为MGRE环境&#xff0c;r3为中心 3&#xff0c;整个OSPF的ip地址基于172.16.0.0/16划分 所以设备都可以访问r4的环回 4减少LSA的数量加快…

CSS实现jd的商品列表,附完整代码!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

vue2如何创建一个项目?

目录 1. 安装环境&#xff1a; 2. 安装Vue CLI 3. 创建新项目 4. 选择配置 5. 安装依赖并运行 6. 开始开发 7. 构建项目 8. 预览生产环境构建 首先创建一个vue2项目&#xff0c;你可以通过以下步骤进行&#xff1a; 1. 安装环境&#xff1a; 保证自己的电脑已经安装N…

Jetpack Compose简介

文章目录 Jetpack Compose简介概述声明式UI和命令式UIJetpack Compose和Android View对比Compose API设计原则一切皆为函数组合优于继承单一数据源 Jetpack Compose和Android View关系使用ComposesetContent()源码ComposablePreview Jetpack Compose简介 概述 Jetpack Compos…

ElasticSearch教程入门到精通——第五部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第五部分&#xff08;基于ELK技术栈elasticsearch 7.x8.x新特性&#xff09; 1. Elasticsearch集成1.1 框架集成-SpringData-整体介绍1.2 Spring Data Elasticsearch 介绍1.3 框架集成-SpringData-代码功能集成1.3.1 创建Maven项目1.3.2 修改po…

持续记录|UNIAPP适配APP遇到的问题以及解决方案

在使用UNIAPP开发APP的时候遇到的一些奇奇怪怪问题记录 组件样式丢失 问题&#xff1a;组件引入界面中&#xff0c;在小程序和H5环境下样式正常&#xff0c;而在APP中却出现高度异常问题 解决&#xff1a;增加view标签将组件包裹起来即可正常显示 解决前&#xff1a; 解决后…

笔记:编写程序,绘制一个展示支付宝月账单报告的饼图,

文章目录 前言一、饼图是什么&#xff1f;二、分析题目三、编写代码总结 前言 编写程序&#xff0c;绘制一个展示支付宝月账单报告的饼图&#xff0c;实现过程如下&#xff1a; &#xff08;1&#xff09; 导入 matplotlib.pyplot 模块&#xff1b; &#xff08;2&#xff09;…

《Fundamentals of Power Electronics》——三端电池的旋转、负载差分连接

以下是关于三端电池的旋转的相关知识点&#xff1a; Buck电路、Boost电路和Buck-Boost电路均包含一个与单刀单掷开关相连的电感。如下图所示。 将上图中的电感和开关网络视为一个标有a,b,c三端的基础电池。该电池在电源和负载之间有三种不同的连接方式。a-A b-B c-C连接方式组…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录片段

全书共分15章&#xff1a;第1章是自动驾驶系统的概述&#xff08;场景分类、开发路径和数据闭环等&#xff09;&#xff0c;第2章简介自动驾驶的基础理论&#xff0c;即计算机视觉和深度学习等&#xff0c;第3&#xff5e;4章是自动驾驶的软硬件平台分析&#xff0c;包括传感器…

《动手学深度学习(Pytorch版)》Task02:预备知识——4.25打卡

《动手学深度学习&#xff08;Pytorch版&#xff09;》Task02&#xff1a;预备知识——4.25打卡 数据操作N维数组——张量创建数组访问元素入门初始化矩阵 运算符广播机制索引和切片节省内存转换为其他Python对象转换为NumPy张量ndarray张量转换为Python标量 数据预处理安装pan…

第一阶段--Day1--什么是网络安全?网络安全常用术语

目录 1. 什么是网络安全&#xff1f; 信息系统&#xff08;Information System&#xff09; 信息系统安全三要素&#xff08;CIA&#xff09; 网络空间安全管理流程 网络安全管理 2. 网络安全的常用术语 3. 网络安全形势 4. 中国网络安全产业现状 1. 什么是网络安全&am…

JFormDesigner 替换自定义类对象, code generation , custom creation code

JFormDesigner 文件的右侧 Code Generation -> Custom Creation Code 编辑写入 自定义的类对象

【一步一步了解Java系列】:探索Java基本类型与C语言的区别

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努…

C++初阶之类和对象(下)

一、构造函数 1、构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _…

Java对象在堆和栈上的存储(对象布局,待完善)

0、前言 这里提到的 Java 对象不仅仅包含引用类型&#xff08;Object&#xff09;&#xff0c;还包含基本数据类型&#xff08;boolean、int、long、float、double&#xff09;。文中部分图片来源于 B站 黑马程序员。 1、在栈上的数据存储 1.1、局部变量 局部变量包含以下情…

2024最新docker部署gitlab

docker部署gitlab 快速命令 1 拉取镜像 docker pull gitlab/gitlab-ce2 启动容器 docker run -itd \-p 9980:80 \-p 9922:22 \-v /opt/soft/docker/gitlab/etc:/etc/gitlab \-v /opt/soft/docker/gitlab/log:/var/log/gitlab \-v /opt/soft/docker/gitlab/opt:/var/opt/g…