Gensim训练词向量与Embedding相关知识

在进行文本分类的时候,预处理我们可以自己做一个词向量模型,也可以采用预训练的模型。采用预训练的模型比如谷歌基于goole news训练的Word2vec模型,由于在大量文本数据中训练过,所以词的概率分布会比较准确,当自己的数据集比较小的时候,用预训练数据有利于提升模型的准确度。 以下内容使用了tensorflow。 训练文本生成word2vec模型 自己训练模型一般有以下几步: 处理数据集,首先gensim的Word2Vec()方法需要的输入是句子顺序的单词,比如 我 爱 你 而不是我爱你,所以要将文本数据分词处理,在这个过程中,我们可以去除停用词,英文全部小写,语法统一等处理,可能对词向量的训练比较有帮助。 完成文本的处理以后,我们得到一个分词后的文本数据集,比如一个列表[‘she’, ‘is’, ‘beautiful’],在gensim模块中可以简单的使用model=gensim.models.word2vec.Word2Vec()得到训练的模型。 该方法有一些参数: sentences-即数据集;sg-设置训练算法,0代表CBOW,1代表skip-gram算法; size-指特征向量的维度,默认为100,大的size需要更多数据,效果更好,但是过大则浪费资源,效果提升不明显; window-当前词与预测词在一个句子中的最大距离,默认是5,比如 我 今天 成功 完成 工作,对于 成功,如果设置窗口为2,可能去预测的词就是我 今天 完成 和 工作,注意是最大值而不是一定选取四个词。最后模型输出的是一个概率分布,即一个词出现在其他词边的概率是多少,我们也就可以据此去发现相似的词。 min_count-去除词频小于min_count的词; hs-1采用hierarchy softmax,0采用negative sample; iter-迭代次数 workers-参数控制训练的并行数¨C9C 更多参考: //www.cnblogs.com/kjkj/p/9825418.html 其他训练词向量有相似的方法和思路,网上有很多资料。 使用预训练词向量 首先加载获取到准备好的模型,然后我们的目标是得到一个embedding_metrics即词向量矩阵,词向量矩阵的shape为(vocab_size, embedding_dim),它是我们要用于训练的数据的每个词(更具体的说是词表中的词)在训练好的模型中的词向量组成的矩阵。 接下来处理训练数据,即用tokenizer处理训练后的数据得到词表,然后将每条文本数据转变为用词表索引数字代替各单词表示的列表,这里给词编码的顺序是词频由高到低,再进行padding使句子输入变为定长,最后我们利用word_index和模型生成embedding_metrics,数据的准备就基本完成了。这些步骤使用tensorflow提供的api可以很简单的实现。 生成代码及相关解释如下: embedding_matrix = np.zeros((len(word_index) + 1, word2vec.vector_size)) # len(word_index) + 1,加1是因为word_index的标记是从1开始而非0,这样词索引与词向量刚好对应,并且对于padding后为 # 0的填充位置可以有对应的映射。 for word, index in word_index.items(): try: embedding_vector = word2vec.wv.getitem(str(word)) embedding_matrix[int(index)] = embedding_vector except KeyError: print("vector not found for word - %s" % word) Embedding层做了什么? Embedding层就是以one hot为输入、中间层节点为词向量维数的全连接层!而这个全连接层的参数,就是一个“词向量表”即我们的embedding_metrics,也就是说,其实onehot的作用就是查表,选择onehot表示的词对应的词向量,然后输出到下一层去。如果我们不用预处理的词向量,就是放一个空矩阵在embedding层(或者说是随机初始化参数),然后在训练网络过程中更新参数。 ...

May 22, 2020 · Xiangtao XIAO

NLP分类效果衡量指标(F1/p/r)

概念 为什么要计算F1:避免样本分布带来的偏差,综合考量分类效果,假如有100个样本,其中1个正样本,99个负样本,如果模型的预测只输出0,那么正确率是99%,这时候用正确率来衡量模型的好坏显然是不对的。 真实 1真实 0预测 1True Positive(TP)False Positive(FP)预测 0False Negative(FN)True Negative(TN) 查准率(precision),预测正确的样本在所有预测为1的样本中的比例,该值反映有多少其他类被错误的归为该类。 召回率(recall),预测正确的样本在所有真实为1的样本中的比例,该值反映有多少该类被预测为其他类了。 F1(F1-Score), 精准率和召回率的调和平均数。 Micro-F1与Macro-F1 针对多标签分类而言衡量分类效果 Micro-F1:直接计算所有类别的Precision和Recall,然后计算F1。(类别有权重,分到样本数多的类别有更大的影响力) Macro-F1:计算出每一个类的Precision和Recall并分别计算F1,最后将F1平均。(各类别的F1权重相同) 代码实现 二分类 def f1(y_hat, y_true): ''' 输入张量y_hat是输出层经过sigmoid激活的张量 y_true是label{0,1}的集和 model指的是如果是多任务分类,single会返回每个分类的f1分数,multi会返回所有类的平均f1分数(Marco-F1) 如果只是单个二分类任务,则可以忽略model ''' epsilon = 1e-7 y_hat = tf.round(y_hat)#将经过sigmoid激活的张量四舍五入变为0,1输出 # 输入的数据是矩阵,标签为单行矩阵,预测值为单列矩阵,如果不是需要转换 tp = tf.cast(tf.matmul(y_true,y_hat), 'float') #tn = tf.sum(tf.cast((1-y_hat)<em>(1-y_true), 'float'), axis=0) fp = tf.cast(tf.matmul(1-y_true,y_hat), 'float') fn = tf.cast(tf.matmul(y_true,1-y_hat), 'float') print('tp: ', tp[0][0].numpy(),'fp: ', fp[0][0].numpy(),'fn: ', fn[0][0].numpy()) p = tp/(tp+fp+epsilon)#epsilon的意义在于防止分母为0,否则当分母为0时python会报错 r = tp/(tp+fn+epsilon) f1 = 2</em>p<em>r/(p+r+epsilon) result = [f1[0][0].numpy(), p[0][0].numpy(), r[0][0].numpy()] return result 多标签 ...

May 22, 2020 · Xiangtao XIAO

多标签分类(multi-label)分类方法笔记

概述 multi-label是相较multi-class的概念,有关研究相对较少,multi-label指一个数据可以被分为多个类,一个输入对应多个输出,例如一篇新闻可以被同时打上娱乐、体育等多个类,类的数目也不确定; 对于multi-label问题的处理,主要看到三种思路: 当类别之间没有较强的联系时,将multi-label转化为多个二分类问题,对于每个类专门训练一个分类器,然后将多个分类器对同个样本进行分类输出结果达到多标签的效果。 当类别之间有一定联系的时候,将multi-label转化为multi-class问题,比如用二进制编码表示三个类:[‘人’, ‘猫’, ‘狗’],0表示不是该类,1表示是,则对于多标签分类可能有[0, 1, 1]的情况比如一张图片上既有猫又有狗,那么我们可以将每一个向量作为一个类别,比如[0, 1, 1]作为一个类,将[1, 0, 1]作为一个类,这样一来我们得到一个23个类,对单一样本输出的结果一定在这个类别空间中,这样就是一个多分类问题了,总共8个类,可以用长度为8的独热编码表示。 当然对于类别特别多(n个类)的数据集,这时候类别空间就是2n,显然类别太多了运算压力大,可以选择将类别输出的种类限制在训练集数据中存在的类别中,比如[1, 0, 0]在训练集中没有这个输出,就把他从类别中去除,当然这会影响模型的准确程度,因为它不再识别那些被踢出的可能性。 最后一种就是改进算法使其能够直接处理多标签问题,输出多个类。 多标签分类算法 对于神经网络,简单的做法是在最后输出层使用sigmoid激活函数,输出数目为类别数,每个输出都是一个概率,注意输出的多个类别的概率总和不再是1,因为是多标签问题,然后损失函数用binary_crossentrophy,相当于对每个输出分别判断属不属于该类,从而使每一个可能属于的类的概率都趋近1。 在简单的单层CNN算法的实验上效果并不是很好,确实得到了多输出的结果,但是出现了某个类概率接近1,另一个所属类概率虽然也比较突出但数值偏小,比如0.5左右的样子,同时属于3个或4个类效果就更差些,可以通过修改阈值比如threshold=0.3,大于0.3就算做该类,但改善不明显。应该和数据集不同类对应存在的样本不同有关。

May 22, 2020 · Xiangtao XIAO

Natural Language Processing相关概念理解

NLP一般流程 文本预处理->词向量与文本表示->特征选择与特征抽取->分类算法 词向量与文本表示 词袋模型(BOW) 将所有词汇放进一个袋子里,假设有n个词,则每个句子表示为一个长度为n的词频向量,词频即对应词在句子里出现的次数,如果没有出现就是0。这种方法句子里的语义信息被完全遗失了。 word based encodings 另一种思路是表示句子,这样就可以把词在句子中的位置关系考虑进去,例如 “我 喜欢 猫”和 “我 喜欢 狗”分别表示为(0 1 2)和(0 1 3),这里的数字不再是词频,而是对应单词被分配的编码,如果词重复了,显然在数组中对应的数字也会重复。 padding 句子长度不同时,需要将他们转化为统一长度的向量输入到神经网络中训练,这时就要padding,设置一个长度n,如果句子长度小于n,就在数组左侧或右侧填充0,如果句子长了,就把左侧或右侧多余的部分忽略,具体方位由自己选择。 词向量模型(word embedding) 考虑词与词之间的位置关系。原本用随机分配的数字代表每一个词,词与词之间是完全独立的,而embedding使得每一个词成为了一个n维空间中的向量,如果两个词的含义相近,那么相应的向量距离也就进,这样就考虑到了词的含义。 word2Vec : 底层采用基于CBOW和Skip-Gram算法的神经网络模型。 CBOW模型: CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。由于CBOW使用的是词袋模型,因此上下文的几个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。 这样我们这个CBOW的例子里,我们的输入是上下文选定的词向量,输出是所有词的softmax概率(训练的目标是期望训练样本特定词对应的softmax概率最大),对应的CBOW神经网络模型输入层有4个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某4个词对应的最可能的输出中心词时,我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。 Skip-Gram模型: Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。 这样我们这个Skip-Gram的例子里,我们的输入是特定词, 输出是softmax概率排前几的词,对应的Skip-Gram神经网络模型输入层有1个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某1个词对应的最可能的4个上下文词时,我们可以通过一次DNN前向传播算法得到概率大小排前4的softmax概率对应的神经元所对应的词即可。 词向量模型突出特点: 在词向量模型中,词向量与词向量之间有这非常特殊的特性。例如现在存在国王、男生、女人、皇后四个词向量,那么一个完善的词向量模型,就存在“国王-男人+女人=皇后”这样的关系。 参考: 词袋模型(BOW,bag of words)和词向量模型(Word Embedding)概念介绍

May 21, 2020 · Xiangtao XIAO

NLP数据准备相关代码记录

csv文件 什么是csv文件 csv既逗号分隔符文件,行数据用’,‘分隔,列数据用换行符’\n’分隔 读取与写入csv文件 with open(filename, 'r', encoding='gbk') as rf: reader = csv.reader(rf, dialect=csv.excel) # 按行读取,读取的是存储为excel可读格式的csv文件,这个文件可以用excel打开查看 with open(r'clean_data\clean_data_0.5_no_repeat.csv', 'w', encoding='gbk', newline='') as f: writer = csv.writer(f, dialect=csv.excel, delimiter=',') for data in final_dataset: writer.writerow(data) # 按行写入,写入格式也是csv.excel,会把一个二维列表自动存储为表格,行列对应,存储的内容是原封不动的 csv文件存储格式与换行问题 用以上方法读取的csv文件每一行每一列取出的都是字符串’str’格式,对于字典要用eval()函数自动转回原本对应的格式,而int等也要用对应函数转换 newline=’’“设置存储的行与行之间没有空行,否则会隔行存储。 json格式 json格式文件特点 json格式文本对{对象:值},例如: {“name”: “John Doe”, “age”: 18, “address”: {“country” : “china”, “zip-code”: “10000”}},和字典有些相似,存储的值可以是字符串,数组,字典等,这个格式好处在于可以存储结构相对复杂的数据并且易于存取。 json与str,json的读取 在实际操作中似乎直接把json放在列表里就可以和其他数据一样存储到csv文件中,在使用csv.writer方法时,双引号的问题被自动解决了,取出以后和其他数据一样都是str,使用json.loads()方法即可转换为json格式数据,写入的时候可以用同样的方法转换。 转换后的json格式数据按对象取值的方法与字典相似,即data[‘对象名’]->值 python集合、列表、字典 在处理重复数据时(这里指字符串或数值的数据),可以采用集合进行存储,因为集合中元素不能重复,可以很简单的使用set()或list()方法将集合和列表相互转换,因此可以利用集合去重后在转换为list存储。 要注意的是,创建空的集合要使用a = set()方法,如果是a={}则是一个空的字典。 当存储集合时如果集合为空会存储一个空集,内容为set()。 集合增加元素要用add()方法,集合没有列表的append()方法。 在处理数据时,字典一个很大的用处在于给出的key是有语义的,这提高了代码的可读性,list[1]中的数据是什么我们是不知道的,而dict[‘key’]则很好懂。 tensorflow输入数据格式转化 constant方法生成张量,tensorflow搭建的算法输入数据都是相应格式的张量,而不是列表,因此如果采用csv.reader读取csv文件而不是tensorflow自带的方法读取csv文件的话,要用对应的tensorflow或者numpy方法将数据转化为张量,通常为[None,*]None为数据量比如有2000条训练文本,None就是2000,后面的就是处理后的数据格式,比如设置的padding,maxlen=500的embedding size=12后的文本数据,格式就是[None,500,12],label数据格式也要与之相对应。 tensorflow自带的读取csv文件的方法可以直接得到tensor格式的数据,但是由于我要处理的csv文件是文本文件并且包含json,这个时候还是先用csv的方法处理完比较好。

May 21, 2020 · Xiangtao XIAO

TensorFlow基础API

看网课视频老师讲的一些,实际上官方文档有非常详细的介绍 import numpy as np import tensorflow as tf # tf基础api:常量 t = tf.constant([[1., 2., 3.], [4., 5., 6.]]) # index索引操作 print(t) print(t[:, 1:]) print(t[..., 1]) #%% # ops算数操作 print(t+10) print(tf.square(t)) print(t @ tf.transpose(t)) # 乘转置 #%% # numpy conversion print(t.numpy()) print(np.square(t)) np_t = np.array([[1., 2., 3.], [4., 5., 6.]]) print(tf.constant(np_t)) #%% # Scalars tensor可以使0维、1维... t = tf.constant(2.718) print(t.numpy()) print(t.shape) #%% # strings t = tf.constant('cafe') print(t) print(tf.strings.length(t)) print(tf.strings.length(t, unit='UTF8_CHAR')) print(tf.strings.unicode_decode(t, 'UTF8')) #%% # string array t = tf.constant(['cafe', 'coffee', '咖啡']) print(tf.strings.length(t, unit='UTF8_CHAR')) r = tf.strings.unicode_decode(t, 'UTF8') print(r) #%% # ragged tensor r = tf.ragged.constant([[11, 12], [21, 22, 23], [], [41]]) # index op print(r) print(r[1]) print(r[1:2]) #%% # ops on ragged tensor r2 = tf.ragged.constant([[51, 52], [], [71]]) print(tf.concat([r, r2], axis=0)) r3 = tf.ragged.constant([[13, 14], [15], [], [41, 42, 43]]) print(tf.concat([r, r3], axis=1)) # ragged tensor 变成 普通tensor 空位用0补齐,注意0永远在正常值的后面 print(r.to_tensor()) #%% # sparse tensor 0可以在正常值前面 s = tf.SparseTensor(indices=[[0, 1], [1, 0], [2, 3]], values=[1., 2., 3.], dense_shape=[3, 4]) print(s) print(tf.sparse.to_dense(s)) # 稀疏矩阵转密集矩阵,这样的稀疏矩阵不能用ragged tensor来表示 #%% # ops on sparse tensors s2 = s * 2.0 print(s2) try: s3 = s + 1 except TypeError as ex: print(ex) s4 = tf.constant([[10., 20.], [30., 40.], [50., 60.], [70., 80.]]) print(tf.sparse.sparse_dense_matmul(s, s4)) #%% s5 = tf.SparseTensor(indices=[[0, 2], [0, 1], [2, 3]], # 没有排好序的稀疏矩阵无法被转换为密集矩阵 values=[1., 2., 3.], dense_shape=[3, 4]) print(s5) s6 = tf.sparse.reorder(s5) # 对s5进行排序 print(tf.sparse.to_dense(s6)) #%% # Variable 变量 v = tf.Variable([[1., 2., 3.], [4., 5., 6.]]) print(v) print(v.value()) print(v.numpy()) #%% # assign value 变量重新赋值 v.assign(2*v) print(v.numpy()) v[0, 1].assign(42) print(v.numpy()) v[1].assign([7., 8., 9.]) print(v.numpy()) #%% # 不能用=号,只能用assign()重新赋值 try: v[1] = [7., 8., 9.] except TypeError as ex: print(ex) # 'ResourceVariable' object does not support item assignment

May 21, 2020 · Xiangtao XIAO

卷积神经网络(CNN)理论与实现

一、理论 卷积神经网络结构:(卷积层+(可选)池化层)*N+全连接层*M(M>=0),卷积层的输入输出是矩阵,全连接层输入输出是向量,在卷积层的最后一层做一个展平。 主要用于分类任务 全卷积神经网络:(卷积层+(可选)池化层)*N+反卷积层*K,可以做物体分割类任务 卷积操作 解决参数过多导致的计算资源不足,容易过拟合的问题。解决方法:局部连接(基于图像的区域性)、参数共享(基于图像特征与位置无关) 卷积核是反向传播计算出的参数,卷积:卷积核与输入做点积乘法。步长:卷积核每次在输入上滑动的距离。padding:使输出size不变。 池化操作 类似卷积,计算方式不同,最大值池化:池化核滑动覆盖区域的最大值作为结果输出。 特点:常使用不重叠(kernal-size=步长)、不补零的操作。参数即为步长和池化核大小。用于减少图像尺寸,从而减少计算量。一定程度平移鲁棒。损失了空间精度。 二、实现 embedding_dim = 16 batch_size = 128 cnn_model = keras.models.Sequential([ keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length), keras.layers.Conv1D(filters=256,kernel_size=2,kernel_initializer='he_normal', strides=1,padding='SAME',activation='relu'), keras.layers.GlobalMaxPooling1D(), keras.layers.Dropout(rate=0.5), keras.layers.Dense(12, activation='sigmoid') ]) cnn_model.summary() cnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) Conv1D 在文本中,卷积的某一维大小往往为embedding长度,即在宽度上不需要窗口移动,宽度就是整个窗口,所以conv1d默认卷积的宽度就为embedding维度,长度通过kernel_size来指定的,此处为2,即卷积核的大小为2*embedding_size。strides为步长,此处为1,即卷积核每隔一个单词移动一次。filters是卷积核的个数,即输出的维度。padding有valid和same两种选择,valid在长度方向(宽度方向不padding)不进行padding,而same则在长度方向进行padding,保证输入句子长度和卷积后输出的句子长度一致。 //blog.csdn.net/bobobe/article/details/87923618 tensorflow fit()方法:参考 //blog.csdn.net/crazyman2010/article/details/103705318 TextCNN //blog.csdn.net/u014732537/article/details/79573174

May 21, 2020 · Xiangtao XIAO

MNIST手写数字识别实践

from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 加载数据 x_train, x_test = x_train / 255.0, x_test / 255.0 # /255:将RGB数值归一化 #%% print(y_train.shape) #%% model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), # 张量扁平化,将28*28的图片矩阵转化为784的向量 tf.keras.layers.Dense(128, activation='relu'), # 全连接层,128个神经元,激活函数为relu(The Rectified Linear Unit) # y=max(0,x) tf.keras.layers.Dropout(0.2), # 防止过拟合,drop out 80% of inputs,使用0.2*cell_size个神经元进行训练 tf.keras.layers.Dense(10, activation='softmax') # 全连接层输出 softmax激活函数 ]) model.compile(optimizer='adam', # 梯度下降策略 adam loss='sparse_categorical_crossentropy', # 损失函数 sparse:y独热化编码 交叉熵 metrics=['accuracy']) # metrics 列表,包含评估模型在训练和测试时的性能的指标,典型用法是metrics=[‘accuracy’]。 # 如果要在多输出模型中为不同的输出指定不同的指标,可向该参数传递一个字典,例如metrics={‘output_a’: ‘accuracy’} model.fit(x_train, y_train, epochs=5) # 训练5轮 model.evaluate(x_test, y_test, verbose=1) # Verbosity mode. 0 = silent, 1 = progress bar. # fit()用于使用给定输入训练模型. # evaluate()用于评估已经训练过的模型.返回损失值&模型的度量值.

May 20, 2020 · Xiangtao XIAO

TensorFlow2.0安装

清华镜像源安装 pip install tensorflow-gpu==1.12.0 -i //pypi.tuna.tsinghua.edu.cn/simple #可改成任意版本 CPU版本安装 pip install tensorflow -i //pypi.tuna.tsinghua.edu.cn/simple Pycharm环境配置 (一)导入TensorFlow模块测试 import tensorflow as tf hello = tf.constant() sess = tf.Session() sess.run(hello) 结果如下:ModuleNotFoundError: No module named ’tensorflow' (二)加入运行路径 设置项目的编译器为python安装位置的python.exe,勾选导入所有的模块,显示如上图所示。再次运行出现同样的错误,查了一些资料应该是电脑的CPU太老了,我下载的tensorflow2.1.0版本不支持。 (三)安装2.0.0版本并测试 运行代码: pip unintall tensorflow 重新运行安装代码:pip install tensorflow==2.0.0 -i //pypi.tuna.tsinghua.edu.cn/simple 再次测试成功! 由于笔记本没有英伟达显卡,配置较低,只安装了CPU版本,后续使用有较好配置的电脑尝试安装GPU版本。确实CPU版本速度比较慢。

May 19, 2020 · Xiangtao XIAO

机器学习入门基本概念理解

张量 张量=容器 张量是现代机器学习的基础。它的核心是一个数据容器,多数情况下,它包含数字,有时候它也包含字符串,但这种情况比较少。因此把它想象成一个数字的水桶。 0维张量=数字;1维张量=向量;2维张量=矩阵;3维张量=公用数据存储在张量,彩色图片等… one-hot vector 独热编码,用于分类标记。比如(猫,狗,鼠)对应(1,0,0)代表猫,(0,1,0)代表狗…将离散型特征采用独热编码,会使得特征之间的距离计算更加合理。 softmax函数 softmax函数的作用主要是:1.通过将模型的预测结果转化到指数函数上将预测结果转化为非负数;2.归一化处理,使各种结果概率之和等于1. //blog.csdn.net/lz_peter/article/details/84574716 交叉熵 对于单标签多分类问题,p(x)表示是否为标记的类,如果用独热编码表示分类,则取值0或1;q(x)则是预测结果为该类的概率。用交叉熵做损失函数,值越小,表示模型预测结果与实际情况一致性越高。 单标签多分类问题所有类别概率和为1,多标签二分类问题所有类别和不为1,交叉熵的计算针对的是单个类别(即二分类),然后单张样本计算多个二分类交叉熵的和。 //blog.csdn.net/tsyccnh/article/details/79163834 欧式空间 欧几里得空间就是在对现实空间的规则抽象和推广(从n<=3推广到有限n维空间)。 欧几里得几何就是中学学的平面几何、立体几何, 在欧几里得几何中,平行线任何位置的间距相等。 而中学学的几何空间一般是2维,3维(所以,我们讨论余弦值、点间的距离、内积都是在低纬空间总结的),如果将这些低维空间所总结的规律推广到有限的n维空间,那这些符合定义的空间则被统称为 欧几里得空间(欧式空间,Euclidean Space)。而欧几里得空间主要是定义了 内积、距离、角(没错,就是初中的那些定义),理解了这些再去理解数学定义就很明确了。 //www.zhihu.com/question/27903807/answer/699570097 梯度弥散与梯度爆炸 靠近输出层的hidden layer 梯度大,参数更新快,所以很快就会收敛; 而靠近输入层的hidden layer 梯度小,参数更新慢,几乎就和初始状态一样,随机分布。 在上面的四层隐藏层网络结构中,第一层比第四层慢了接近100倍!! 这种现象就是梯度弥散(vanishing gradient problem)。而在另一种情况中,前面layer的梯度通过训练变大,而后面layer的梯度指数级增大,这种现象又叫做梯度爆炸(exploding gradient problem)。 总的来说,就是在这个深度网络中,梯度相当不稳定(unstable)。 //www.cnblogs.com/yangmang/p/7477802.html batch_size batch的选择首先决定的是下降的方向,batch_size越大,下降的方向越准确。 综合考虑数据集的大小,数据集比较小的时候,用整个数据集作为batch_size就可以,这时候下降的方向也是最精准的,数据集比较大的时候,相对小的batch可以达到和用整个数据集相似的全局学习率,综合考量学习的效果以及电脑内存是否撑得住,目的是尽量让学习效果和效率同时最大化。 在合理范围内,增大 Batch_Size 有何好处? 内存利用率提高了,大矩阵乘法的并行化效率提高。 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。 batch_size增大到一定程度后,再增大则效率变差,下降方向也基本不再变化。 //blog.csdn.net/starzhou/article/details/53692248 学习率 梯度下降的伪代码如下: 重复已下过程,直到收敛为止{ωj=ωj-λF(ωj) /ωj} λ就是学习率,学习率过小,优化效率可能很低,学习率过大则有可能越过最优值,收敛到局部最优解。 关于解决学习率的一些问题,如选择合适的学习率,动态调整学习率,归一化等参考: //www.cnblogs.com/mazhujun/p/9633576.html 如何通俗地解释欧氏空间? - 知乎 //www.zhihu.com/question/27903807/answer/699570097

May 16, 2020 · Xiangtao XIAO