paper&leetcode,二叉树遍历
Posted NLPer项目算法实战
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了paper&leetcode,二叉树遍历相关的知识,希望对你有一定的参考价值。
一:OpenAI,由诸多硅谷大亨联合建立的人工智能非营利组织。2015年马斯克与其他硅谷科技大亨进行连续对话后,决定共同创建OpenAI,希望能够预防人工智能的灾难性影响,推动人工智能发挥积极作用。
二:Zero-shot learning 指的是我们之前没有这个类别的训练样本。但是我们可以学习到一个映射X->Y。如果这个映射足够好的话,我们就可以处理没有看到的类了。 比如,我们在训练时没有看见过狮子的图像,但是我们可以用这个映射得到狮子的特征。一个好的狮子特征,可能就和猫,老虎等等比较接近,和汽车,飞机比较远离。感性认识的话,虽然我们不知道这东西叫狮子,但是我们可以说出他和谁谁谁像。(生物学家第一次看到鸭嘴兽的感觉。)
三:在得到不同的语言模型(一元语言模型、二元语言模型....)的时候,我们如何判断一个语言模型是否好还是坏,一般有两种方法:
1、一种方法将其应用到具体的问题当中,比如机器翻译、speech recognition、spelling corrector等。然后看这个语言模型在这些任务中的表现(extrinsic evaluation,or in-vivo evaluation)。但是,这种方法一方面难以操作,另一方面可能非常耗时,可能跑一个evaluation需要大量时间,费时难操作。
2、针对第一种方法的缺点,大家想是否可以根据与语言模型自身的一些特性,来设计一种简单易行,而又行之有效的评测指标。于是,人们就发明了perplexity这个指标。
四:困惑度(perplexity)的基本思想是:给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好,公式如下:
五:嘻哈说唱中经常听到rapper说skrr这个词,其实说唱中Skrt一般用来形容汽车甩尾(漂移)发出的轮胎摩擦音,在Trap里面用来象征,甩开,抛弃,逃离等意思。另外skrt可以作语气词,表示激动,兴奋。
六:请问计算机视觉里的消融实验(ablation experiment)是什么意思?
比如说这篇文章有3个亮点,这一章就负责告诉你我只加a结果如何,只加b结果如何,a和b都加了又如何
就是相当于高中的控制变量法,哈哈,看各因素带来的影响
七:看到有人对flops有疑惑,先捋清这个概念。FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。网上打字很容易全小写,造成混淆,本问题针对模型,应指的是FLOPs。以下答案不考虑activation function的运算。
八:
1、ELECTRA是BERT推出这一年来我见过最赞的idea,它不仅提出了能打败MLM的预训练任务,更推出了一种十分适用于NLP的类GAN框架。
2、另外要注意的一点是,在优化判别器时计算了所有token上的loss,而以往计算BERT的MLM loss时会忽略没被mask的token。作者在后来的实验中也验证了在所有token上进行loss计算会提升效率和效果。
3、作者认为生成器对embedding有更好的学习能力,因为在计算MLM时,softmax是建立在所有vocab上的,之后反向传播时会更新所有embedding,而判别器只会更新输入的token embedding。最后作者只使用了embedding sharing。
4、生成器的大小在判别器的1/4到1/2之间效果是最好的。作者认为原因是过强的生成器会增大判别器的难度(判别器:小一点吧,我太难了)。
5、由于ELECTRA是判别式任务,不用对整个数据分布建模,所以更parameter-efficient。
6、BERT虽然对上下文有很强的编码能力,却缺乏细粒度语义的表示,这是把token编码降维后的效果,可以看到sky和sea明明是天与海的区别,却因为上下文一样而得到了极为相似的编码。
九:模型蒸馏落地就要落实到损失函数的修改上,剪枝这里可以分为weight pruning(WP)和structured pruning(SP),只将LayerDrop应用在训练过程中还有提升效果的奇效,而且能提升一定的训练速度。
10:对比学习的核心思想,就是让模型学习如何将正样本和其他负样本区别开来,抓住样本的本质特征,而不是把每个细节都考虑到。
1、在自监督的情况下,对比学习利用数据增强方法,给每个输入样本输入构建另一个view 作为正例,并使用同batch下其他样本作为负例,达到拉近正例拉开负例的“对比”目的
2、监督数据作者则提出了一个新的对比学习loss SCL,将同一类的样本互相作为正例,不同类别的作为负例。以此达到拉近类内样本、拉开类间距离的目的。
11:
1、多模态学习,CLIP的全称是Contrastive Language–Image Pre-training,OpenAI从网上搜集了400million未清洗的图像-文本pair数据,用对比学习目标进行训练:分别对图像和文本编码,然后两两计算cosine相似度,再针对每个图片的一行或文本的一列进行分类,找出匹配的正例,说CLIP是图像的GPT-2,但还是有些区别的,GPT-2是生成模型,而CLIP是判别模型。
2、OpenAI的DALLE模型,直接通过文字描述生成图片。
#########################################前序遍历
########## 方法一迭代:
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def preorderTraversal(self,root:TreeNode):
if not root:return []
stack,res=[root],[]
while stack:
node=stack.pop()
if node:
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
########## 方法二迭代模板:
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def preorderTraversal(self,root:TreeNode):
if not root:return []
cur,stack,res=root,[],[]
while cur or stack:
while cur:
res.append(cur.val)
stack.append(cur)
cur=cur.left
tmp=stack.pop()
cur=tmp.right
return res
##############方法三递归
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def preorderTraversal(self, root: TreeNode):
res = []
def dfs(root):
if not root:return
res.append(root.val)
dfs(root.left)
dfs(root.right)
dfs(root)
return res
#########################################中序遍历
#方法一迭代模板
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def inorderTraversal(self,root:TreeNode):
if not root: return []
cur, stack, res = root, [], []
while cur or stack:
while cur:
stack.append(cur)
cur = cur.left
tmp = stack.pop()
res.append(tmp.val)
cur = tmp.right
return res
#方法二递归
class TreeNode:
def __init__(self,val=0,left=None,right=None):
self.val=val
self.left=left
self.right=right
class Solution:
def inorderTraversal(self,root:TreeNode):
res=[]
def dfs(root):
if not root:return
dfs(root.left)
res.append(root.val)
dfs(root.right)
dfs(root)
return res
#########################################后序遍历
#方法一迭代
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def postorderTraversal(self,root:TreeNode):
if not root:return []
stack,res=[root],[]
while stack:
node=stack.pop()
if node:
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
res.append(node.val)
return res
#方法二迭代模板
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def postorderTraversal(self,root:TreeNode):
if not root: return []
stack, res = [(0,root)], []
while stack:
flag,node=stack.pop()
if not node:continue
if flag==1:
res.append(node.val)
else:
stack.append((1,node))
stack.append((0,node.right))
stack.append((0,node.left))
return res
#方法三递归
class TreeNode:
def __init__(self,val=0,left=None,right=None):
self.val=val
self.left=left
self.right=right
class Solution:
def postorderTraversal(self,root:TreeNode):
res=[]
def dfs(root):
if not root:return
dfs(root.left)
dfs(root.right)
res.append(root.val)
dfs(root)
return res
#########################################层次遍历
# encoding=utf-8
class TreeNode:
def __init__(self,x):
self.val=x
self.left=None
self.right=None
#pop(0) 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。这里代表第一个元素,完全可以用来模拟队列
#pop()默认最后一个元素,完全可以用来买模拟栈
class Solution:
def levelOrder(self,root:TreeNode):
if not root:return []
res,q=[],[root]
while q:
level=[]
for i in range(len(q)):
node=q.pop(0)
level.append(node.val)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
res.append(level)
return res
以上是关于paper&leetcode,二叉树遍历的主要内容,如果未能解决你的问题,请参考以下文章