• 3.27日学习笔记


    1.kaggle竞赛技巧

    https://blog.csdn.net/wtq1993/article/details/51418958  讲的蛮不错!

    EDA:(Exploratory Data Analysis)对数据进行探索性的分析,从而为之后的处理和建模提供必要的结论。

    常见地画的图包括:label的图查看是否均衡、散点图查看坐标值是否有离群点,对于数值型地变量可以画箱线图。

    预处理包括处理缺失值、离群值outliers。

    一般需要五折交叉验证就可以了。

    包括模型融合和模型Stacking ,后者我还不太理解是什么意思。。。

    2.Glove和word2vec的区别

    https://zhuanlan.zhihu.com/p/31023929 这个说的还比较间接

    glove是基于基于上下文词计数矩阵的,对共现矩阵进行降维。

    但知乎上有人说,glove的效果不好,而且复杂度更高?这点有待验证。

    3.bert到底作用是啥?

    我已经被各种博客给整晕了。难道我要去看bert的原论文了吗

    bert的预训练模型都是什么?如果要从bert中获取词向量应该怎么做?

    在对原论文的阅读中,逐渐解答了一些我之前心中的疑问:

    ①更加粗粒度的表示,包括句子和段落嵌入向量。细粒度的就是词和char吧。对于中文来说char就是单个字。这也就是为什么bert会有nsp任务了,以前一直不理解,也就是CLS表示的是整个句子的特征,更加粗粒度。

    ②BERT不仅在句子水平上,也在token水平上都获得了好的结果。句子级任务比如NSP、情感分类,token就比如NER吧。

    ③这个Masked LM就很像完形填空啊,整个的bert的预训练任务目标其中一部分就是这个,对mask掉的单词进行softmax,维度当然是vocab的维度,然后计算损失。终于理解了。

    ④这个pre-train就是为了学习到widely applicable representations of words。单词的广泛应用的表示。https://www.zhihu.com/question/324943987 大语料出奇迹。能够包含更多的信息吧!

    ⑤一旦预训练的模型学习到了,那么下游的任务所使用的模型初始化参数全都是一样的,之后再根据任务训练微调。

    Each downstream task has sep-arate fine-tuned models, even though they are ini-tialized with the same pre-trained parameters.

    ⑥The final hidden state corresponding to this token [CLS] is used as the aggregate sequence representation for classification tasks.

    最后一层的隐层的输出[CLS]作为一个能够整合整个句子的信息,表示整个句子,可以用来分类任务。

    ⑦它说到elmo模型之所以不用双向的,是因为它能够在上下文中看到自己?https://blog.csdn.net/ACM_hades/article/details/89375058 这里解释说是:因为双向条件语言模型将允许每个单词在多层self-attention中间接看到自己。我还不理解什么是多层自注意力,下面一个问题解决。总之就因为这个它提出了MLM。

    4.多层自注意力机制是啥?

    层叠注意力机制。

    5.为什么bert的三个输入embedding可以相加?

     https://www.zhihu.com/question/374835153

    邱老师的解释真是高级,将文本视为不同波信息的叠加,在bert中就会给解耦出来。

    另一个博主解释为:信息的交叉,交叉能够带来更为丰富的信息,能让上下文敏感。

    下面这个解释也很有意思:

    2020-3-28学习笔记————————————————

    1.交叉验证kfold是如何进行的

    我还是有一点不明白,如果将训练集不划分为训练和测试集,而是全部用来一次性实验,那么就不必要进行交叉验证了吧?

    交叉验证就是为了防止 划分不均匀 产生的损失,但是现在我就没有划分为训练和测试集,哪里会来不均匀呢?

    https://zhuanlan.zhihu.com/p/24825503 这个讲的还不错,我似乎终于理解了LOOCV和K-CV的区别了。。。这个博客里的评论也挺好的。

    前者是每次只留一个样本做训练,计算速度太慢了,而后者是留一个set。

    我还是不太明白,如果直接将train_set全都作为训练集,然后训练几个epoch,或者使用交叉验证来训练会有什么区别?并不一定第一个效果就是好的啊。

    https://stackoverflow.com/questions/60567302/does-it-make-sense-to-do-cross-validation-when-fine-tuning-a-language-model-like 这个就有一个问题bert的微调用交叉验证是否有用?

    回答里说,交叉验证主要是用来验证模型在unseen数据上的表现,所以可以用?

    我现在关于交叉验证的疑问,如果每次都选择表现最好的那组交叉验证的模型保存起来,那很多博客说的取平均是怎么一回事?我一直认为的交叉验证都是在同一个模型上,而很明显这个每次交叉验证迭代都是一个全新的模型,就和上一次kfold学习到的参数完全无关?

    我再找找其他的训练代码。。。

    https://mc.ai/how-to-develop-a-convolutional-neural-network-from-scratch-for-mnist-handwritten-digit-classification/ 又看了好多,包括这个,我感觉emm每个人写的似乎都有所不同,那我还是根据最初的那个来写?假设是5折。

    ①每次model都用类新生成,不保留上一折训练的参数结果,本次训练后就对测试集预测输出,并对5次预测输出求和,之后再softmax做分类。

    ②每次model都用类新生成,不保留上一折训练的参数结果,本次训练后在验证集上计算损失,保留并更新损失最小的作为对预测集预测的模型,之后单独加载模型预测。

    ③每次model都一次定义,使用上次经过训练后的参数模型,只获取到在所有验证集上的损失,并且用唯一的这个model作为对预测集预测的模型,之后单独加载模型预测。

    基本上是这三种吧,但是我不知道哪一种是有效的啊。好难!太难了吧!我该怎么办呢?去群里提问吗?

    https://www.jianshu.com/p/f14826061612 我又看了这里面提及到的一些点,交叉验证只是为了验证比如说两个模型(神经网络和逻辑回归)哪个总体来说更好,而不是去得到某一个模型(如神经网络)的参数,用它只是在确定模型训练好后,去查看一下它的效果!原来是这样啊,我好像确实一直理解错了,它是只用来比较模型的!!!

    https://stats.stackexchange.com/questions/52274/how-to-choose-a-predictive-model-after-k-fold-cross-validation 就是这些里面讲到的点,英文确实比中文更能get到point啊!!!

    我好像彻底明白了!我就应该用全部的train_data去正常地训练模型,然后得到这个模型后,我就kfold ,k=5交叉验证,查看结果,这个结果我是可以记录下来的。

    2020-5-1更新————————

    https://blog.csdn.net/m0_38061927/article/details/76180541 这里面评论区提到:

    我觉得说的很有道理哎,但是跟我之前的理解就产生了冲突啊,交叉验证不是只为了去比较模型吗?这里居然说是为了选出最优参数?这。。

    但是如果我面试被问到交叉验证有什么用,我还是不能总结出个1234点,这种还是要看面经吗?虽然我有了一点理解,但让我去给出一个比较系统的答案我还是做不到,要直接叙述的话就感觉非常乱。愁!

    2.BertTokenizer.from_pretrained('bert-base-chinese')如何实现的分词?

    是以字粒度划分的!~

    然后再split,简单粗暴~

    3.通过config创建bert和from_pretrained一样吗?

    用config怎么保证创建的bert是我想要的那个呢?这个config就是个json文件啊,那100多M的bert模型数据都存到什么地方了?我也没看到有下载的地方啊,我总觉得通过fromm_pretrained才是有效的啊?

    对啊,我没看到下面还有这一句,只不过是提前下载好了,config当然也是已经预训练好的bert模型的对应的参数咯。

    我还是不够仔细吧,不过其实峰回路转发现还是很简单的。

     5.bert的vocab文件

    下面是bert-base-chinese.tar.gz解压后的文件的内容,用于构建预训练模型。

    而Tokenizer的构建需要词表,https://zhuanlan.zhihu.com/p/50773178 

    6.BertModel类中forward返回encoded_layers, pooled_output,意义分别是什么?

    其实非常好理解,你就看

    类里的描述就ok了,非常清楚,如果参数为True,那就返回所有隐层块的,而为False,就只会返回最后一层注意力块的,其实我觉得返回所有的没有必要吧,什么任务要求返回所有的呢?

    对于token级别的任务来说,就False,然后用encoded_layers就可;对于句子级别分类任务,就可以只用pooled_output就ok了。

    2020-3-29———————————————————————

    8.CNN+LSTM和LSTM+CNN有什么区别呢?

    针对情感分类,都有什么方法呢?

    9.conv1d 对batch的sequence举例!

     https://discuss.pytorch.org/t/understanding-convolution-1d-output-and-input/30764/3 这个里面举的例子还不错,我有了自己的理解。

    import torch
    from torch import nn
    
    a = torch.randn(32, 100, 10) #假设a为[batch_size, sequence_length, emb_size]
    m = nn.Conv1d(100, 50, 2) #[input_channel,output_channel, kernel_size]
    out = m(a)
    print(out.size())#[batch_size,output_channel,计算公式(emb_size+2p-kernel_size)/s+1=10-2+1=9]
    print(m)
    
    #输出:
    torch.Size([32, 50, 9])
    Conv1d(100, 50, kernel_size=(2,), stride=(1,))

     所以在这个一维卷积的过程中,batch_size不会受影响,而seq_length就是输出通道数,卷积后的seq_length就是输出通道数,然后嵌入层的大小变化,适合kernel_size有关系的。

    同时Number of filters = Number of out_channels.  也就是说,输出通道数,输出后的seq_length=output_channel。

    从官方给的样例中,也能够看出来:https://pytorch.org/docs/stable/nn.html#torch.nn.Conv1d

    import torch
    import torch.nn as nn             # 神经网络模块
    m = nn.Conv1d(16, 33, 3, stride=2)
    input = torch.randn(20, 16, 50)
    output = m(input)
    print(output.shape)
    
    #输出:
    torch.Size([20, 33, 24])
    #输出通道是33哦。

    10.Linux重定向输出 2>&1

    https://blog.csdn.net/liucy007/article/details/90207830  这样就重定向,这个讲的挺不错的。

     11. Expected input batch_size (4) to match target batch_size (32).

    https://discuss.pytorch.org/t/valueerror-expected-input-batch-size-324-to-match-target-batch-size-4/24498/5

    The first thing running into a size mismatch error is to check your tensor shapes.

    遇到size不对的,就检查tensor的shape!!!

    还是不对,我觉得我应该没问题的啊,这是怎么回事? 

    由此我也发现了一个惊天大秘密啊!

    import torch
    import torch.nn as nn             # 神经网络模块
    rnn = nn.LSTM(10, 20, 2,batch_first=True)
    input = torch.randn(3, 5, 10)
    h0 = torch.randn(2,3,20)
    c0 = torch.randn(2,3,20)
    output, (hn, cn) = rnn(input, (h0, c0))
    print(output.size(),hn.size(),cn.size())
    
    #输出:
    torch.Size([3, 5, 20]) torch.Size([2, 3, 20]) torch.Size([2, 3, 20])
    
    #如果企图将h0的batch_size和num_layers*num_direction改为h0 = torch.randn(3,2,20)会报错:
    #RuntimeError: Expected hidden[0] size (2, 3, 20), got (3, 2, 20)

    OMG!上面的就说明,batch_first=True只对output有影响,对hidden和cell完全没有影响啊,姜还是老的辣,我还是太嫩了点。

    hidden的shape仍旧是[num_layers*num_direction, batch_size, emb_size]。

    12.tf对应的cuda版本!tf原来有这些版本

    https://www.tensorflow.org/install/source#common_installation_problems

     13.安装tf1.14后出现:

    FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.

    https://github.com/tensorflow/tensorflow/issues/30427 给的解释非常好,查看了我的numpy版本之后发现是1.18,就卸载,然后

    pip install "numpy<1.17"

    之后再导入tf就不会有这个warning了。

    14.不能用GPU了???

    >>> torch.cuda.is_available()
    False

    为啥不能用GPU了?????

    难道是cuda10.0谁给我动了?真烦!!!之前不还好好的吗?操,又被环境搞死在这!

    https://stackoverflow.com/questions/58595291/runtime-error-999-when-trying-to-use-cuda-with-pytorch

    这里和我的问题一模一样,里面答案是说重启,我怎么可能重启我实验室的电脑呢,我又不在实验室,这风险太大了点。万一不行的话,我就再也打不开用不上了。。。风险太大,不行。

    1.可能是我换环境的问题吗?

    还是false,可咋整啊。。。

    我又重新安装了pytorch1.4.0还是不行,还是false,我慌了,这可咋整。、

    15。使用清华源安装朋友torch,非常快

    conda config --remove-key channels  删除所有channel,

    https://blog.csdn.net/zzq060143/article/details/88042075 就是这个讲的非常好。

    windows端:https://blog.csdn.net/asdfg6541/article/details/104488926/ ,是有效的!变得快了不少。

    16.cuda版本切换

    https://blog.csdn.net/Maple2014/article/details/78574275

    原来那个形成的是软连接啊!

    #在切换cuda版本时
    rm -rf /usr/local/cuda#删除之前创建的软链接
    sudo ln -s /usr/local/cuda-8.0/ /usr/local/cuda/
    nvcc --version #查看当前 cuda 版本
    
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2016 NVIDIA Corporation
    Built on Mon_Jan_23_12:24:11_CST_2017
    Cuda compilation tools, release 8.0, V8.0.62
    
    #cuda8.0 切换到 cuda9.0 
    rm -rf /usr/local/cuda
    sudo ln -s /usr/local/cuda-9.0/ /usr/local/cuda/
    nvcc --version

    17.nvidia-smi和cuda版本不匹配

    https://stackoverflow.com/questions/53422407/different-cuda-versions-shown-by-nvcc-and-nvidia-smi

    这里的大体意思是说,前者是在安装驱动的时候安的,然后cuda一般是由conda安的,但是真正运行时的cuda是由nvcc -V来确定的,两者不match,并没有什么影响。

    排除了是这个方面的问题。

    18.尝试了deviceQuery检查

    果然不仅是torch的问题啊,是cuda整个的问题,早知道我就不用卸载torch然后安装,那么麻烦了。哭。

    https://blog.csdn.net/qq_33200967/article/details/80689543

    cd /usr/local/cuda-10.0/samples/1_Utilities/deviceQuery
    make
    ./deviceQuery

    用来测试是否安装成功,果然没有安装成功,总算是有一点点眉目了。

    ./deviceQuery Starting...
    
     CUDA Device Query (Runtime API) version (CUDART static linking)
    
    cudaGetDeviceCount returned 30
    -> unknown error
    Result = FAIL

    我还没有遇到过这个问题吧,真可怕啊。

  • 相关阅读:
    Java的类演进过程
    P112、面试题16:反转链表
    P107、面试题15:链表中倒数第K个结点
    Java对象相关元素的初始化过程
    P102、面试题14:调整数组顺序使奇数位于偶数前面
    P99、面试题13:在o(1)时间删除链表结点
    面试常考的数据结构Java实现
    Linux命令面试常考的简单汇总
    操作系统与进程基础知识
    python--process
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/12584623.html
Copyright © 2020-2023  润新知