2017年10月5日星期四

谷歌开发者机器学习词汇表:纵览机器学习基本词汇与概念

选自Google Developers

机器之心编译

机器之心曾开放过人工智能术语集 ,该术语库项目目前收集了人工智能领域 700 多个专业术语,但仍需要与各位读者共同完善与修正。本文编译自谷歌开发者机器学习术语表项目,介绍了该项目所有的术语与基本解释。之后,我们也将表内术语更新到了机器之心 GitHub 项目中。本文由浙江大学博士生杨海宏推荐,他的研究方向为知识图谱问答。

机器之心人工智能术语项目:http://ift.tt/2sVnduo



A

准确率(accuracy)

分类模型预测准确的比例。在多类别分类中,准确率定义如下:

在二分类中,准确率定义为:

激活函数(Activation function)

一种函数(例如 ReLU 或 Sigmoid),将前一层所有神经元激活值的加权和输入到一个非线性函数中,然后向下一层传递该函数的输出值(典型的非线性)。

AdaGrad

一种复杂的梯度下降算法,重新调节每个参数的梯度,高效地给每个参数一个单独的学习率。详见论文:http://ift.tt/2y0F5oE

AUC(曲线下面积)

一种考虑到所有可能的分类阈值的评估标准。ROC 曲线下面积代表分类器随机预测真正类(Ture Positives)要比假正类(False Positives)概率大的确信度。



B

反向传播(Backpropagation)

神经网络中完成梯度下降的重要算法。首先,在前向传播的过程中计算每个节点的输出值。然后,在反向传播的过程中计算与每个参数对应的误差的偏导数。

基线(Baseline)

被用为对比模型表现参考点的简单模型。基线帮助模型开发者量化模型在特定问题上的预期表现。

批量

模型训练中一个迭代(指一次梯度更新)使用的样本集。

批量大小(batch size)

一个批量中样本的数量。例如,SGD 的批量大小为 1,而 mini-batch 的批量大小通常在 10-1000 之间。批量大小通常在训练与推理的过程中确定,然而 TensorFlow 不允许动态批量大小。

偏置(bias)

与原点的截距或偏移量。偏置(也称偏置项)被称为机器学习模型中的 b 或者 w0。例如,偏置项是以下公式中的 b:y′=b+w_1x_1+w_2x_2+…w_nx_n。

注意不要和预测偏差混淆。

二元分类器(binary classification)

一类分类任务,输出两个互斥(不相交)类别中的一个。例如,一个评估邮件信息并输出「垃圾邮件」或「非垃圾邮件」的机器学习模型就是一个二元分类器。

binning/bucketing

根据值的范围将一个连续特征转换成多个称为 buckets 或者 bins 二元特征,称为 buckets 或者 bins。例如,将温度表示为单一的浮点特征,可以将温度范围切割为几个离散的 bins。假如给定的温度的敏感度为十分之一度,那么分布在 0.0 度和 15.0 度之间的温度可以放入一个 bin 中,15.1 度到 30.0 度放入第二个 bin,30.1 度到 45.0 度放入第三个 bin。



C

标定层(calibration layer)

一种调整后期预测的结构,通常用于解释预测偏差。调整后的预期和概率必须匹配一个观察标签集的分布。

候选采样(candidate sampling)

一种优化训练时间的,使用 Softmax 等算法计算所有正标签的概率,同时只计算一些随机取样的负标签的概率。例如,有一个样本标记为「小猎兔狗」和「狗」,候选取样将计算预测概率,和与「小猎兔狗」和「狗」类别输出(以及剩余的类别的随机子集,比如「猫」、「棒棒糖」、「栅栏」)相关的损失项。这个想法的思路是,负类别可以通过频率更低的负强化(negative reinforcement)进行学习,而正类别经常能得到适当的正强化,实际观察确实如此。候选取样的动力是计算有效性从所有负类别的非计算预测的得益。

检查点(checkpoint)

在特定的时刻标记模型的变量的状态的数据。检查点允许输出模型的权重,也允许通过多个阶段训练模型。检查点还允许跳过错误继续进行(例如,抢占作业)。注意其自身的图式并不包含于检查点内。

类别(class)

所有同类属性的目标值作为一个标签。例如,在一个检测垃圾邮件的二元分类模型中,这两个类别分别是垃圾邮件和非垃圾邮件。而一个多类别分类模型将区分狗的种类,其中的类别可以是贵宾狗、小猎兔狗、哈巴狗等等。

类别不平衡数据集(class-imbalanced data set)

这是一个二元分类问题,其中两个类别的标签的分布频率有很大的差异。比如,一个疾病数据集中若 0.01% 的样本有正标签,而 99.99% 的样本有负标签,那么这就是一个类别不平衡数据集。但对于一个足球比赛预测器数据集,若其中 51% 的样本标记一队胜利,而 49% 的样本标记其它队伍胜利,那么这就不是一个类别不平衡数据集。

分类模型(classification)

机器学习模型的一种,将数据分离为两个或多个离散类别。例如,一个自然语言处理分类模型可以将一句话归类为法语、西班牙语或意大利语。分类模型与回归模型(regression model)成对比。

分类阈值(classification threshold)

应用于模型的预测分数以分离正类别和负类别的一种标量值标准。当需要将 logistic 回归的结果映射到二元分类模型中时就需要使用分类阈值。例如,考虑一个确定给定邮件为垃圾邮件的概率的 logistic 回归模型,如果分类阈值是 0.9,那么 logistic 回归值在 0.9 以上的被归为垃圾邮件,而在 0.9 以下的被归为非垃圾邮件。

混淆矩阵(confusion matrix)

总结分类模型的预测结果的表现水平(即,标签和模型分类的匹配程度)的 NxN 表格。混淆矩阵的一个轴列出模型预测的标签,另一个轴列出实际的标签。N 表示类别的数量。在一个二元分类模型中,N=2。例如,以下为一个二元分类问题的简单的混淆矩阵:

上述混淆矩阵展示了在 19 个确实为肿瘤的样本中,有 18 个被模型正确的归类(18 个真正),有 1 个被错误的归类为非肿瘤(1 个假负类)。类似的,在 458 个确实为非肿瘤的样本中,有 452 个被模型正确的归类(452 个真负类),有 6 个被错误的归类(6 个假正类)。

多类别分类的混淆矩阵可以帮助发现错误出现的模式。例如,一个混淆矩阵揭示了一个识别手写数字体的模型倾向于将 4 识别为 9,或者将 7 识别为 1。混淆矩阵包含了足够多的信息可以计算很多的模型表现度量,比如精度(precision)和召回(recall)率。

连续特征(continuous feature)

拥有无限个取值点的浮点特征。和离散特征(discrete feature)相反。

收敛(convergence)

训练过程达到的某种状态,其中训练损失和验证损失在经过了确定的迭代次数后,在每一次迭代中,改变很小或完全不变。换句话说就是,当对当前数据继续训练而无法再提升模型的表现水平的时候,就称模型已经收敛。在深度学习中,损失值下降之前,有时候经过多次迭代仍保持常量或者接近常量,会造成模型已经收敛的错觉。

凸函数(concex function)

一种形状大致呈字母 U 形或碗形的函数。然而,在退化情形中,凸函数的形状就像一条线。例如,以下几个函数都是凸函数:

  • L2 损失函数
  • Log 损失函数
  • L1 正则化函数
  • L2 正则化函数

凸函数是很常用的损失函数。因为当一个函数有最小值的时候(通常就是这样),梯度下降的各种变化都能保证找到接近函数最小值的点。类似的,随机梯度下降的各种变化有很大的概率(虽然无法保证)找到接近函数最小值的点。

两个凸函数相加(比如,L2 损失函数+L1 正则化函数)后仍然是凸函数。

深度模型通常是非凸的。出乎意料的是,以凸优化的形式设计的算法通常都能在深度网络上工作的很好,虽然很少能找到最小值。

成本(cost)

loss 的同义词。

交叉熵(cross-entropy)

多类别分类问题中对 Log 损失函数的推广。交叉熵量化两个概率分布之间的区别。参见困惑度(perplexity)。



D

数据集(data set)

样本的集合。

决策边界(decision boundary)

在一个二元分类或多类别分类问题中模型学习的类别之间的分离器。例如,下图就展示了一个二元分类问题,决策边界即橙点类和蓝点类的边界。

深度模型(deep model)

一种包含多个隐藏层的神经网络。深度模型依赖于其可训练的非线性性质。和宽度模型对照(wide model)。

密集特征(dense feature)

大多数取值为非零的一种特征,通常用取浮点值的张量(tensor)表示。和稀疏特征(sparse feature)相反。

派生特征(derived feature)

合成特征(synthetic feature)的同义词。

离散特征(discrete feature)

只有有限个可能取值的一种特征。例如,一个取值只包括动物、蔬菜或矿物的特征就是离散(或类别)特征。和连续特征(continuous feature)对照。

dropout 正则化(dropout regularization)

训练神经网络时一种有用的正则化方法。dropout 正则化的过程是在单次梯度计算中删去一层网络中随机选取的固定数量的单元。删去的单元越多,正则化越强。

动态模型(dynamic model)

以连续更新的方式在线训练的模型。即数据连续不断的输入模型。



E

早期停止法(early stopping)

一种正则化方法,在训练损失完成下降之前停止模型训练过程。当验证数据集(validation data set)的损失开始上升的时候,即泛化表现变差的时候,就该使用早期停止法了。

嵌入(embeddings)

一类表示为连续值特征的明确的特征。嵌入通常指将高维向量转换到低维空间中。例如,将一个英语句子中的单词以以下任何一种方式表示:

  • 拥有百万数量级(高维)的元素的稀疏向量,其中所有的元素都是整数。向量的每一个单元表示一个单独的英语单词,单元中的数字表示该单词在一个句子中出现的次数。由于一个句子中的单词通常不会超过 50 个,向量中几乎所有的单元都是 0。少量的非零的单元将取一个小的整数值(通常为 1)表示句子中一个单词的出现次数。
  • 拥有数百个(低维)元素的密集向量,其中每一个元素取 0 到 1 之间的浮点数。

在 TensorFlow 中,嵌入是通过反向传播损失训练的,正如神经网络的其它参量一样。

经验风险最小化(empirical risk minimization,ERM)

选择能最小化训练数据的损失的模型函数的过程。和结构风险最小化(structual risk minimization)对照。

集成(ensemble)

多个模型预测的综合考虑。可以通过以下一种或几种方法创建一个集成方法:

  • 设置不同的初始化;
  • 设置不同的超参量;
  • 设置不同的总体结构。

深度和广度模型是一种集成。

评估器(Estimator)

 tf.Estimator 类的一个例子,封装 logic 以建立一个 TensorFlow 图并运行一个 TensorFlow session。你可以通过以下方式创建自己的评估器:http://ift.tt/2mVfSaT

样本(example)

一个数据集的一行内容。一个样本包含了一个或多个特征,也可能是一个标签。参见标注样本(labeled example)和无标注样本(unlabeled example)。



F

假负类(false negative,FN)

被模型错误的预测为负类的样本。例如,模型推断一封邮件为非垃圾邮件(负类),但实际上这封邮件是垃圾邮件。

假正类(false positive,FP)

被模型错误的预测为正类的样本。例如,模型推断一封邮件为垃圾邮件(正类),但实际上这封邮件是非垃圾邮件。

假正类率(false positive rate,FP rate)

ROC 曲线(ROC curve)中的 x 轴。FP 率的定义是:假正率=假正类数/(假正类数+真负类数)

特征(feature)

输入变量,用于做出预测。

特征列(feature columns/FeatureColumn)

具有相关性的特征的集合,比如用户可能居住的所有可能的国家的集合。一个样本的一个特征列中可能会有一个或者多个特征。

TensorFlow 中的特征列还可以压缩元数据比如下列情况:

  • 特征的数据类型;
  • 一个特征是固定长度的或应该转换为嵌入。
  • 一个特征列可以仅包含一个特征。「特征列」是谷歌专用的术语。在 VW 系统(Yahoo/Microsoft)中特征列的意义是「命名空间」(namespace),或者场(field)。

特征交叉(feature cross)

将特征进行交叉(乘积或者笛卡尔乘积)运算后得到的合成特征。特征交叉有助于表示非线性关系。

特征工程(feature engineering)

在训练模型的时候,决定哪些特征是有用的,然后将记录文件和其它来源的原始数据转换成上述特征的过程。在 TensorFlow 中特征工程通常意味着将原始记录文件输入 tf.Example 协议缓存中。参见 tf.Transform。特征工程有时候也称为特征提取。

特征集(feature set)

机器学习模型训练的时候使用的特征群。比如,邮政编码,面积要求和物业状况可以组成一个简单的特征集,使模型能预测房价。

特征定义(feature spec)

描述所需的信息从 tf.Example 协议缓存中提取特征数据。因为 tf.Example 协议缓存只是数据的容器,必须明确以下信息:

  • 需要提取的数据(即特征的关键信息)
  • 数据类型(比如,浮点数还是整数)
  • 数据长度(固定的或者变化的)

Estimator API 提供了从一群特征列中生成一个特征定义的工具。

完全 softmax(full softmax)

参见 softmax。和候选采样对照。



G

泛化(generalization)

指模型利用新的没见过的数据而不是用于训练的数据作出正确的预测的能力。

广义线性模型(generalized linear model)

最小二乘回归模型的推广/泛化,基于高斯噪声,相对于其它类型的模型(基于其它类型的噪声,比如泊松噪声,或类别噪声)。广义线性模型的例子包括:

  • logistic 回归
  • 多分类回归
  • 最小二乘回归

广义线性模型的参数可以通过凸优化得到,它具有以下性质:

  • 最理想的最小二乘回归模型的平均预测结果等于训练数据的平均标签。
  • 最理想的 logistic 回归模型的平均概率的预测结果等于训练数据的平均标签。

广义线性模型的能力局限于其特征的性质。和深度模型不同,一个广义线性模型无法「学习新的特征」。

梯度(gradient)

所有变量的偏导数的向量。在机器学习中,梯度是模型函数的偏导数向量。梯度指向最陡峭的上升路线。

梯度截断(gradient clipping)

在应用梯度之前先修饰数值,梯度截断有助于确保数值稳定性,防止梯度爆炸出现。

梯度下降(gradient descent)

通过计算模型的相关参量和损失函数的梯度最小化损失函数,值取决于训练数据。梯度下降迭代地调整参量,逐渐靠近权重和偏置的最佳组合,从而最小化损失函数。

图(graph)

在 TensorFlow 中的一种计算过程展示。图中的节点表示操作。节点的连线是有指向性的,表示传递一个操作(一个张量)的结果(作为一个操作数)给另一个操作。使用 TensorBoard 能可视化计算图。



H

启发式(heuristic)

一个问题的实际的和非最优的解,但能从学习经验中获得足够多的进步。

隐藏层(hidden layer)

神经网络中位于输入层(即特征)和输出层(即预测)之间的合成层。一个神经网络包含一个或多个隐藏层。

折页损失函数(Hinge loss)

损失函数的一个类型,用于分类模型以寻找距离每个样本的距离最大的决策边界,即最大化样本和边界之间的边缘。KSVMs 使用 hinge 损失函数(或相关的函数,比如平方 hinge 函数)。在二元分类中,hinge 损失函数按以下方式定义:

loss=max(0,1−(y′∗y))

其中 y'是分类器模型的列输出:

y′=b+w_1x_1+w_2x_2+…w_nx_n

y 是真实的标签,-1 或+1。

因此,hinge 损失将是下图所示的样子:

测试数据(holdout data)

有意不用于训练的样本。验证数据集(validation data set)和测试数据集(test data set)是测试数据(holdout data)的两个例子。测试数据帮助评估模型泛化到除了训练数据之外的数据的能力。测试集的损失比训练集的损失提供了对未知数据集的损失更好的估计。

超参数(hyperparameter)

连续训练模型的过程中可以拧动的「旋钮」。例如,相对于模型自动更新的参数,学习率(learning rate)是一个超参数。和参量对照。



I

独立同分布(independently and identically distributed,i.i.d)

从不会改变的分布中获取的数据,且获取的每个值不依赖于之前获取的值。i.i.d. 是机器学习的理想情况——一种有用但在现实世界中几乎找不到的数学构建。例如,网页访客的分布可能是短暂时间窗口上的 i.i.d;即分布不会在该时间窗口发生改变,每个人的访问都与其他人的访问独立。但是,如果你扩展了时间窗口,则会出现网页访客的季节性差异。

推断(inference)

在机器学习中,通常指将训练模型应用到无标注样本来进行预测的过程。在统计学中,推断指在观察到的数据的基础上拟合分布参数的过程。

输入层(input layer)

神经网络的第一层(接收输入数据)。

评分者间一致性(inter-rater agreement)

用来衡量一项任务中人类评分者意见一致的指标。如果意见不一致,则任务说明可能需要改进。有时也叫标注者间信度(inter-annotator agreement)或评分者间信度(inter-rater reliability)。



K

Kernel 支持向量机(Kernel Support Vector Machines/KSVM)

一种分类算法,旨在通过将输入数据向量映射到更高维度的空间使正类和负类之间的边际最大化。例如,考虑一个输入数据集包含一百个特征的分类问题。为了使正类和负类之间的间隔最大化,KSVM 从内部将特征映射到百万维度的空间。KSVM 使用的损失函数叫作 hinge 损失。



L

L1 损失函数(L1 loss)

损失函数基于模型对标签的预测值和真实值的差的绝对值而定义。L1 损失函数比起 L2 损失函数对异常值的敏感度更小。

L1 正则化(L1 regularization)

一种正则化,按照权重绝对值总和的比例进行惩罚。在依赖稀疏特征的模型中,L1 正则化帮助促使(几乎)不相关的特征的权重趋近于 0,从而从模型中移除这些特征。

L2 损失(L2 loss)

参见平方损失。

L2 正则化(L2 regularization)

一种正则化,按照权重平方的总和的比例进行惩罚。L2 正则化帮助促使异常值权重更接近 0 而不趋近于 0。(可与 L1 正则化对照阅读。)L2 正则化通常改善线性模型的泛化效果。

标签(label)

在监督式学习中,样本的「答案」或「结果」。标注数据集中的每个样本包含一或多个特征和一个标签。比如,在房屋数据集中,特征可能包括卧室数量、卫生间数量、房龄,而标签可能就是房子的价格。在垃圾邮件检测数据集中,特征可能包括主题、发出者何邮件本身,而标签可能是「垃圾邮件」或「非垃圾邮件」。

标注样本(labeled example)

包含特征和标签的样本。在监督式训练中,模型从标注样本中进行学习。

lambda

正则化率的同义词。(该术语有多种含义。这里,我们主要关注正则化中的定义。)

层(layer)

神经网络中的神经元序列,可以处理输入特征序列或神经元的输出。

它也是 TensorFlow 的一种抽象化概念。层是将张量和配置选项作为输入、输出其他张量的 Python 函数。一旦必要的张量出现,用户就可以通过模型函数将结果转换成估计器。

学习率(learning rate)

通过梯度下降训练模型时使用的一个标量。每次迭代中,梯度下降算法使学习率乘以梯度,乘积叫作 gradient step。

学习率是一个重要的超参数。

最小二乘回归(least squares regression)

通过 L2 损失最小化进行训练的线性回归模型。

线性回归(linear regression)

对输入特征的线性连接输出连续值的一种回归模型。

logistic 回归(logistic regression)

将 sigmoid 函数应用于线性预测,在分类问题中为每个可能的离散标签值生成概率的模型。尽管 logistic 回归常用于二元分类问题,但它也用于多类别分类问题(这种情况下,logistic 回归叫作「多类别 logistic 回归」或「多项式 回归」。

对数损失函数(Log Loss)

二元 logistic 回归模型中使用的损失函数。

损失

度量模型预测与标签距离的指标,它是度量一个模型有多糟糕的指标。为了确定损失值,模型必须定义损失函数。例如,线性回归模型通常使用均方差作为损失函数,而 logistic 回归模型使用对数损失函数。



M

机器学习(machine learning)

利用输入数据构建(训练)预测模型的项目或系统。该系统使用学习的模型对与训练数据相同分布的新数据进行有用的预测。机器学习还指与这些项目或系统相关的研究领域。

均方误差(Mean Squared Error/MSE)

每个样本的平均平方损失。MSE 可以通过平方损失除以样本数量来计算。TensorFlow Playground 展示「训练损失」和「测试损失」的值是 MSE。

小批量(mini-batch)

在训练或推断的一个迭代中运行的整批样本的一个小的随机选择的子集。小批量的大小通常在 10 到 1000 之间。在小批量数据上计算损失比在全部训练数据上计算损失要高效的多。

小批量随机梯度下降(mini-batch stochastic gradient descent)

使用小批量的梯度下降算法。也就是,小批量随机梯度下降基于训练数据的子集对 梯度进行评估。Vanilla SGD 使用 size 为 1 的小批量。

模型(model)

机器学习系统从训练数据中所学内容的表示。该术语有多个含义,包括以下两个相关含义:

  • TensorFlow 图,显示如何计算预测的结构。
  • TensorFlow 图的特定权重和偏差,由训练决定。

模型训练(model training)

确定最佳模型的过程。

动量(Momentum)

一种复杂的梯度下降算法,其中的学习步不只依赖于当前步的导数,还依赖于先于它的步。动量包括随着时间计算梯度的指数加权移动平均数,类似于物理学中的动量。动量有时可以阻止学习陷于局部最小值。

多类别(multi-class)

在多于两类的类别中进行分类的分类问题。例如,有约 128 种枫树,那么分类枫树品种的模型就是多类别的。反之,把电子邮件分成两个类别(垃圾邮件和非垃圾邮件)的模型是二元分类器模型。



N

NaN trap

训练过程中,如果模型中的一个数字变成了 NaN,则模型中的很多或所有其他数字最终都变成 NaN。NaN 是「Not a Number」的缩写。

负类(negative class)

在二元分类中,一个类别是正类,另外一个是负类。正类就是我们要找的目标,负类是另外一种可能性。例如,医疗测试中的负类可能是「非肿瘤」,电子邮件分类器中的负类可能是「非垃圾邮件」。

神经网络(neural network)

该模型从大脑中获取灵感,由多个层组成(其中至少有一个是隐藏层),每个层包含简单的连接单元或神经元,其后是非线性。

神经元(neuron)

神经网络中的节点,通常输入多个值,生成一个输出值。神经元通过将激活函数(非线性转换)应用到输入值的加权和来计算输出值。

归一化(normalization)

将值的实际区间转化为标准区间的过程,标准区间通常是-1 到+1 或 0 到 1。例如,假设某个特征的自然区间是 800 到 6000。通过减法和分割,你可以把那些值标准化到区间-1 到+1。参见缩放。

numpy

Python 中提供高效数组运算的开源数学库。pandas 基于 numpy 构建。



O

目标(objective)

算法尝试优化的目标函数。

离线推断(offline inference)

生成一组预测并存储,然后按需检索那些预测。可与在线推断对照阅读。

one-hot 编码(one-hot encoding)

一个稀疏向量,其中:

  • 一个元素设置为 1。
  • 所有其他的元素设置为 0。

独热编码常用于表示有有限可能值集合的字符串或标识符。例如,假设一个记录了 15000 个不同品种的植物数据集,每一个用独特的字符串标识符来表示。作为特征工程的一部分,你可能将那些字符串标识符进行独热编码,每个向量的大小为 15000。

一对多(one-vs.-all)

给出一个有 N 个可能解决方案的分类问题,一对多解决方案包括 N 个独立的二元分类器——每个可能的结果都有一个二元分类器。例如,一个模型将样本分为动物、蔬菜或矿物,则一对多的解决方案将提供以下三种独立的二元分类器:

  • 动物和非动物
  • 蔬菜和非蔬菜
  • 矿物和非矿物

在线推断(online inference)

按需生成预测。可与离线推断对照阅读。

运算(Operation/op)

TensorFlow 图中的一个节点。在 TensorFlow 中,任何创建、控制或损坏张量的步骤都是运算。例如,矩阵乘法是一个把两个张量作为输入、生成一个张量作为输出的运算。

优化器(optimizer)

梯度下降算法的特定实现。TensorFlow 的基类优化器是 tf.train.Optimizer。不同的优化器(tf.train.Optimizer 的子类)对应不同的概念,如:

  • 动量(Momentum)
  • 更新频率(AdaGrad = ADAptive GRADient descent;Adam = ADAptive with Momentum;RMSProp)
  • 稀疏性/正则化(Ftrl)
  • 更复杂的数学(Proximal 及其他)

你甚至可以想象 NN-driven optimizer。

异常值(outlier)

与大多数值差别很大的值。在机器学习中,下列都是异常值:

  • 高绝对值的权重。
  • 与实际值差距过大的预测值。
  • 比平均值多大约 3 个标准差的输入数据的值。

异常值往往使模型训练中出现问题。

输出层(output layer)

神经网络的「最后」一层。这一层包含整个·模型所寻求的答案。

过拟合(overfitting)

创建的模型与训练数据非常匹配,以至于模型无法对新数据进行正确的预测。



P

pandas

一种基于列的数据分析 API。很多机器学习框架,包括 TensorFlow,支持 pandas 数据结构作为输入。参见 pandas 文档。

参数(parameter)

机器学习系统自行训练的模型的变量。例如,权重是参数,它的值是机器学习系统通过连续的训练迭代逐渐学习到的。可与超参数对照阅读。

参数服务器(Parameter Server/PS)

用于在分布式设置中跟踪模型参数。

参数更新(parameter update)

在训练过程中调整模型参数的操作,通常在梯度下降的单个迭代中进行。

偏导数(partial derivative)

一个多变量函数的偏导数是它关于其中一个变量的导数,而保持其他变量恒定。例如,f(x, y) 对于 x 的偏导数就是 f(x) 的导数,y 保持恒定。x 的偏导数中只有 x 是变化的,公式中其他的变量都不用变化。

分区策略(partitioning strategy)

在多个参数服务器中分割变量的算法。

性能(performance)

具有多种含义:

  • 在软件工程中的传统含义:软件运行速度有多快/高效?
  • 在机器学习中的含义:模型的准确率如何?即,模型的预测结果有多好?

困惑度(perplexity)

对模型完成任务的程度的一种度量指标。例如,假设你的任务是阅读用户在智能手机上输入的单词的头几个字母,并提供可能的完整单词列表。该任务的困惑度(perplexity,P)是为了列出包含用户实际想输入单词的列表你需要进行的猜测数量。

困惑度和交叉熵的关系如下:

流程(pipeline)

机器学习算法的基础架构。管道包括收集数据、将数据放入训练数据文件中、训练一或多个模型,以及最终输出模型。

正类(positive class)

在二元分类中,有两种类别:正类和负类。正类是我们测试的目标。(不过必须承认,我们同时测试两种结果,但其中一种不是重点。)例如,医疗测试中正类可能是「肿瘤」,电子邮件分类器中的正类可能是「垃圾邮件」。可与负类对照阅读。

精度(precision)

分类模型的一种指标。准确率指模型预测正类时预测正确的频率。即:

预测(prediction)

模型在输入样本后的输出结果。

预测偏差(prediction bias)

揭示预测的平均值与数据集中标签的平均值的差距。

预制评估器(pre-made Estimator)

已经构建好的评估器。TensorFlow 提供多个预制评估器,包括 DNNClassifier、DNNRegressor 和 LinearClassifier。你可以根据指导(http://ift.tt/2gdr7GC

预训练模型(pre-trained model)

已经训练好的模型或模型组件(如嵌入)。有时,你将预训练嵌入馈送至神经网络。其他时候,你的模型自行训练嵌入,而不是依赖于预训练嵌入。

先验信念(prior belief)

训练开始之前你对数据的信念。例如,L2 正则化依赖于权重值很小且正常分布在 0 周围的信念。



Q

队列(queue)

实现队列数据结构的 TensorFlow 操作。通常在输入/输出(I/O)中使用。



R

秩(rank)

机器学习领域中包含多种含义的术语:

  • 张量中的维度数量。比如,标量有 1 个秩,向量有 1 个秩,矩阵有 2 个秩。(注:在这个词汇表中,「秩」的概念和线性代数中「秩」的概念不一样,例如三阶可逆矩阵的秩为 3。)
  • 机器学习问题中类别的序数位置,按从高到低的顺序给类别分类。比如,行为排序系统可以把狗的奖励按从高(牛排)到低(甘蓝)排序。

评分者(rater)

为样本提供标签的人,有时也叫「标注者」。

召回率(recall)

分类模型的一个指标,可以回答这个问题:模型能够准确识别多少正标签?即:

修正线性单元(Rectified Linear Unit/ReLU)

一种具备以下规则的激活函数:

  • 如果输入为负或零,则输出为 0。
  • 如果输入为正,则输出与输入相同。

回归模型(regression model)

一种输出持续值(通常是浮点数)的模型。而分类模型输出的是离散值,如「day lily」或「tiger lily」。

正则化(regularization)

对模型复杂度的惩罚。正则化帮助防止过拟合。正则化包括不同种类:

  • L1 正则化
  • L2 正则化
  • dropout 正则化
  • early stopping(这不是正式的正则化方法,但可以高效限制过拟合)

正则化率(regularization rate)

一种标量级,用 lambda 来表示,指正则函数的相对重要性。从下面这个简化的损失公式可以看出正则化率的作用:

minimize(loss function + λ(regularization function))

提高正则化率能够降低过拟合,但可能会使模型准确率降低。

表征

将数据映射到有用特征的过程。

受试者工作特征曲线(receiver operating characteristic/ROC Curve)

反映在不同的分类阈值上,真正类率和假正类率的比值的曲线。参见 AUC。

根目录(root directory)

指定放置 TensorFlow 检查点文件子目录和多个模型的事件文件的目录。

均方根误差(Root Mean Squared Error/RMSE)

均方误差的平方根。



S

Saver

负责存储模型检查点文件的 TensorFlow 对象。

缩放(scaling)

特征工程中常用的操作,用于控制特征值区间,使之与数据集中其他特征的区间匹配。例如,假设你想使数据集中所有的浮点特征的区间为 0 到 1。给定一个特征区间是 0 到 500,那么你可以通过将每个值除以 500,缩放特征值区间。还可参见正则化。

scikit-learn

一种流行的开源机器学习平台。网址:www.scikit-learn.org

序列模型(sequence model)

输入具有序列依赖性的模型。例如,根据之前观看过的视频序列对下一个视频进行预测。

会话(session)

保持 TensorFlow 程序的状态(如变量)。

Sigmoid 函数(sigmoid function)

把 logistic 或多项式回归输出(对数几率)映射到概率的函数,返回的值在 0 到 1 之间。sigmoid 函数的公式如下:

其中σ在 logistic 回归问题中只是简单的:

在有些神经网络中,sigmoid 函数和激活函数一样。

softmax

为多类别分类模型中每个可能的类提供概率的函数。概率加起来的总和是 1.0。例如,softmax 可能检测到某个图像是一只狗的概率为 0.9,是一只猫的概率为 0.08,是一匹马的概率为 0.02。(也叫作 full softmax)。

稀疏特征(sparse feature)

值主要为 0 或空的特征向量。比如,一个向量的值有 1 个 1,、一百万个 0,则该向量为稀疏向量。再比如,搜索查询中的单词也是稀疏向量:在一种语言中有很多可以用的单词,但给定的查询中只用了其中的一些。

可与稠密特征对照阅读。

平方损失(squared loss)

线性回归中使用的损失函数(也叫作 L2 Loss)。该函数计算模型对标注样本的预测值和标签真正值之间差的平方。在平方之后,该损失函数扩大了不良预测的影响。即,平方损失比 L1 Loss 对异常值(outlier)的反应更加强烈。

静态模型(static model)

离线训练的模型。

稳态(stationarity)

数据集中的一种数据属性,数据分布在一或多个维度中保持不变。通常情况下,维度是时间,意味着具备平稳性的数据不会随着时间发生变化。比如,具备平稳性的数据从 9 月到 12 月不会改变。

步(step)

一个批量中的前向和后向评估。

步长(step size)

学习速率(learning rate)乘以偏导数的值,即梯度下降中的步长。

随机梯度下降(stochastic gradient descent/SGD)

批量大小为 1 的梯度下降算法。也就是说,SGD 依赖于从数据集中随机均匀选择出的一个样本,以评估每一步的梯度。

结构风险最小化(structural risk minimization/SRM)

这种算法平衡两个目标:

  • 构建预测性最强的模型(如最低损失)。
  • 使模型尽量保持简单(如强正则化)。

比如,在训练集上的损失最小化 + 正则化的模型函数就是结构风险最小化算法。更多信息,参见 http://ift.tt/2gdzzpr

摘要(summary)

在 TensorFlow 中,特定步计算的值或值的集合,通常用于跟踪训练过程中的模型指标。

监督式机器学习(supervised machine learning)

利用输入数据及其对应标签来训练模型。监督式机器学习类似学生通过研究问题和对应答案进行学习。在掌握问题和答案之间的映射之后,学生就可以提供同样主题的新问题的答案了。可与非监督机器学习对照阅读。

合成特征(synthetic feature)

不在输入特征中,而是从一个或多个输入特征中派生出的特征。合成特征的类型包括:

  • 特征与自己或其他特征相乘(叫作特征交叉)。
  • 两个特征相除。
  • 将连续的特征放进 range bin 中。

由归一化或缩放单独创建的特征不是合成特征。



T

张量(tensor)

TensorFlow 项目的主要数据结构。张量是 N 维数据结构(N 的值很大),经常是标量、向量或矩阵。张量可以包括整数、浮点或字符串值。

张量处理单元(Tensor Processing Unit,TPU)

优化 TensorFlow 性能的 ASIC(application-specific integrated circuit,专用集成电路)。

张量形状(Tensor shape)

张量的元素数量包含在不同维度中。比如,[5, 10] 张量在一个维度中形状为 5,在另一个维度中形状为 10。

张量大小(Tensor size)

张量包含的标量总数。比如,[5, 10] 张量的大小就是 50。

TensorBoard

展示一个或多个 TensorFlow 项目运行过程中保存的摘要数据的控制面板。

TensorFlow

大型分布式机器学习平台。该术语还指 TensorFlow 堆栈中的基础 API 层,支持数据流图上的通用计算。

尽管 TensorFlow 主要用于机器学习,但是它也适用于要求使用数据流图进行数值运算的非机器学习任务。

TensorFlow Playground

一个可以看到不同超参数对模型(主要是神经网络)训练的影响的平台。前往 http://ift.tt/2y1bNpZ TensorFlow Playground。

TensorFlow Serving

帮助训练模型使之可部署到产品中的平台。

测试集(test set)

数据集的子集。模型经过验证集初步测试之后,使用测试集对模型进行测试。可与训练集和验证集对照阅读。

tf.Example

一种标准 protocol buffer,用于描述机器学习模型训练或推断的输入数据。

训练(training)

确定组成模型的完美参数的流程。

训练集(training set)

数据集子集,用于训练模型。可与验证集和测试集对照阅读。

真负类(true negative,TN)

被模型正确地预测为负类的样本。例如,模型推断某封电子邮件不是垃圾邮件,然后该电邮真的不是垃圾邮件。

真正类(true positive,TP)

被模型正确地预测为正类的样本。例如,模型推断某封电子邮件是垃圾邮件,结果该电邮真的是垃圾邮件。

真正类率(true positive rate,TP rate)

召回率(recall)的同义词。即:

TruePositiveRate=TruePositives/(TruePositives+FalseNegatives)

真正类率是 ROC 曲线的 y 轴。



U

无标签样本(unlabeled example)

包含特征但没有标签的样本。无标签样本是推断的输入。在半监督学习和无监督学习的训练过程中,通常使用无标签样本。

无监督机器学习(unsupervised machine learning)

训练一个模型寻找数据集(通常是无标签数据集)中的模式。

无监督机器学习最常用于将数据分成几组类似的样本。例如,无监督机器学习算法可以根据音乐的各种属性聚类数据。用这种方式收集的数据可以作为其他机器学习算法(如音乐推荐服务)的输入。聚类在难以获取真正标签的情景中非常有用。例如,在反欺诈和反滥用的情景中,聚类可以帮助人类更好地理解数据。

无监督机器学习的另一个例子是主成分分析(principal component analysis,PCA)。如,将 PCA 应用于包含数百万购物车内容的数据集中时,就有可能发现有柠檬的购物车往往也有解酸剂。可与监督式机器学习对照阅读。



V

验证集(validation set)

数据集的一个子集(与训练集不同),可用于调整超参数。可与训练集和测试集对照阅读。



W

权重(weight)

线性模型中的特征系数,或者深度网络中的边缘。线性模型的训练目标是为每个特征确定一个完美的权重。如果权重为 0,则对应的特征对模型而言是无用的。

宽模型(wide model)

线性模型通常具备很多稀疏输入特征。我们称之为「宽」模型,因其具有大量与输出节点直接连接的输入,是一种特殊类型的神经网络。宽模型通常比深度模型更容易调试(debug)和检查。尽管宽模型无法通过隐藏层表达非线性,但它们可以使用特征交叉和 bucketization 等转换用不同方式对非线性建模。可与深度模型对照阅读。

原文链接:http://ift.tt/2y0GPhO



]]> 原文: http://ift.tt/2gcMkR1
RSS Feed

机器知心

IFTTT

2017年10月4日星期三

历经一年,DeepMind WaveNet语音合成技术正式产品化

昨日,谷歌发布了一系列新的产品,从音箱到手机,让我们看到了其产品全面 AI 化的趋势。而 DeepMind 一年前宣布的语音合成技术 WaveNet 也正式产品化,融入谷歌助手之中。本文对升级后的 WaveNet 技术做了解读。


就在一年前,谷歌 DeepMind 发布了 WaveNet,这是一种新的深度神经网络,能生成新的声音信号波形,并且比起其它现有技术,其生成的语音拥有更加逼真的音效。当时这个模型还只处于研究雏形阶段,对于消费性产品而言,模型的计算消耗量太大。


经过 12 个月的努力而大大提升了模型运行的速度和质量之后,谷歌 DeepMind 现在已经推出了 WaveNet 的更新版本,可以在所有的平台上生成美式英语和日语的谷歌助手语音。


使用新的 WaveNet 模型可以使谷歌助手生成一系列更加自然逼真的声音。


为什么 WaveNet 的性能如此高效并可以超越现有的最先进技术水平呢?首先需要理解今天的「文本到语音」(text-to-speech,TTS)系统或语音合成(speech synthesis)系统的工作方式。

大部分系统都是基于所谓的连续式 TTS,即使用大型的高质量录音的数据库,收集单个人数小时的声音记录。这些录音将被分成小块然后组合或成串连接以合成完整的所需的发音。但是这些系统生成的语音通常都是不自然的而且很难调整,因为只要出现了一系列变化,比如需要表达新的情绪或语调的情况,就得建立一个新的数据库记录。


为了解决这些问题,有时候会用一种替代模型,称为参量 TTS。这个模型不需要使用一系列规则和语法、嘴唇动作的参量成串连接声音,而引导计算机生成语音。虽然这个方法更加经济,计算速度也更快,但生成的语音不自然。


WaveNet 采取了完全不同的方法。在相关论文中,作者描述了一种深度生成模型,可以从头开始生成单独的信号波形,每次生成一个样本,每秒生成 16000 个样本,并且在单独的声音之间是无缝过渡的。



在原始的 WaveNet 模型上强化的卷积神经网络结构


WaveNet 使用一个卷积神经网络构建,并在大型的语音样本的数据库中训练。在训练过程中,网络将决定语音的潜在结构,比如哪些音调相互依存,以及哪些信号波形是现实的(哪些又不是现实的)。训练后的网络将每一次合成一个语音样本,而每一个样本都和上一个样本的特性相关。最后生成的语音包含自然的语调以及其它的特征比如咂嘴声,其「口音」依赖于用于训练的语音,为从混合数据集中创造任意数量的独特的声音开辟了可能性。正如其它所有的 TTS 系统一样,WaveNet 使用一个文本输入告诉系统在回答问题的时候,应该生成什么词。


从原始模型中生成如此高保真的声音波形需要消耗相当大的计算量,这意味着 WaveNet 虽然有潜力但是还无法在现实世界中应用。不过经过了 12 个月的努力,谷歌已经开发出了能快速生成信号波形的新模型。它还可以大规模运行,并且是在谷歌最新的 TPU 云基础架构上运行的第一个产品。


WaveNet 的研究团队未来将公布新模型的研究细节。最新改进的 WaveNet 模型仍然能生成新的信号波形但是是以原始模型的 1000 倍的速度生成,意味着它只需要 50ms 就可以生成 1 秒的语音。实际上,该模型不只是快,而且保真度很高,可以在一秒内生成 24000 个信号波形的样本。而且每一个样本的分辨率也从 8bit 提高到了 16bit(和光碟一样的分辨率)。


这将使模型在人类听众测试中给出更加自然的听感。例如,最新的 US English voice I,在 1-5 scale 的测试中得到了 4.347 的平均意见分数(mean-opinion-score,MOS),而即使是人类语音也只能得到 4.667 的分数。




新模型同样保留了原始模型的灵活性,可以在训练过程中更好的利用大量的数据。具体来说就是,可以使用多种语音训练网络。从而,即使对于所需输出的语音只有少量的训练数据,仍然可以生成高质量、细致入微的语音。DeepMind 表示这只是 WaveNet 的开始,他们有信心在未来,语音界面的强大功能将对全世界的语言开放。


]]> 原文: http://ift.tt/2yq8jyJ
RSS Feed

机器知心

IFTTT

NEAT学习:教机器自我编程

本文介绍了一种机器学习方法:通过增强拓扑的进化神经网络(Evolving Neural Networks through Augmenting Topologies,NEAT)。该方法受到进化过程的启发,能够将复杂问题分解,进而解决问题。



在这篇文章中我要阐述一种机器学习方法,叫作「通过增强拓扑的进化神经网络」(Evolving Neural Networks through Augmenting Topologies,NEAT)。


引言


我爱学习。翻开关于我不了解的话题的书或论文,并且尝试着去理解,真是太令人兴奋了。有些人喜欢在闲暇的时候玩一下字谜游戏、数独或者猜谜游戏来活跃思维,而我喜欢阅读论文并且试着实现文中提出的算法。虽然热爱学习,但是我不可能将喜欢的东西全部学完,所以我特别着迷于如何让计算机为我学习,并向我呈现可能最大化我的学习效率的一些有趣的信息。这些有助于将复杂的信息结构化的算法是「专家系统」的一部分。所以这些算法的目标就是「创造」一个我在做决策的时候能够随时向其咨询的「专家」。让我们站在一个比较高的视角看看这个能够帮助创造这些「专家」的模型 NEAT。本文将介绍这一概念。


NEAT 是什么?


NEAT 指「Networks through Augmented Topologies」(通过增强拓扑的进化神经网络),描述了自学习机器的算法概念,这些算法概念受启发于进化过程中的遗传修饰(genetic modification)。


生命本身就是很有魅力的。每当我观察自然界的时候,我都会看到一个存在于所有的生命体中的共同特征,它叫作信息。信息似乎就是繁殖的核心遗传特征。自然界在过去的 37 亿年里能够优化信息,创造很多共存的不同物种。达尔文的「适者生存、不适者淘汰」的理念启迪了我们对物种进化的理解。进化计算机科学家的目标就是构建能够模仿自然进化来解决复杂问题的系统。


描述 NEAT 工作原理的最简单、最容易的方式就是举例。如果你必须设计一个以最佳方式为你玩游戏的专家系统,那么相关的因素会是什么呢?


首先,为「玩家」定义所有允许他们执行的潜在操作是非常重要的。以超级玛丽为例,它能够跳跃、躲闪、向左走、向右走、转动、快跑等等。如果我们将一台机器与这些动作联系起来,并且允许它来执行这些动作,那么它将有能力做这些事。


第二,要给计算机制定一个目标。NEAT 使用一个叫做「适应度评分(Fitness Score)」的变量。适应度评分是一个能够对成功做出奖励的数学函数。在类似《超级玛丽》的游戏中,适应度评分就是玩家朝着终点线不断前进。适应度评分包含很多类似的变量,例如收集的硬币数、击败的敌人数,或者完成游戏所需的时间。


第三,定义进化的规则非常重要。NEAT 允许节点突变、节点之间产生新的连接,以及在新的后代中继承最合适的神经网络。此外,NEAT 确保不同的「物种」可以共存,直至它们为了生成新的、更适合的后代而进行彼此之间的竞争。为了保证适者生存,已经被尝试过的神经网络不会进行重复,而现存的神经网络会进行自我优化,NEAT 为每一个作为历史记录者的基因都添加了一个新的数字。




上图展示了通过添加一个连接和添加一个节点所形成的突变。上面的例子中从 2 到 4 的连接被取消了,另外还建立了一个新的从 3 到 5 的连接。下面的例子中是节点的突变,你可以看到从 2 到 4 的连接被取消了,并且引入了一个新的节点 6,然后生成了从 3 到 6、从 6 到 4 的新连接。



上图展示了进化是如何发生的。parent 1 和 parent 2 在节点和连接上有着相似的结构,但是它们也有区别。机器现在使用二元逻辑来增加或去除节点/连接。基本的决策机制基于同真为真,真假为假,同假为假(true and true is true, true and false is false, false and false is false)-真与真是真,真与假是假,假与假是假-。这种方式能够确保后代的继承信息对适应度评分是有效的,新生后代中会采用新的进化节点和/或连接,已经被取消的父节点仍保持被取消的状态。「匹配的基因是随机遗传的,不相交基因(中间阶段不匹配)和过剩基因(最后阶段不匹配)是从更加适合的 parent 继承的。在这种情况下,假设它们有着相等的适应度评分,那么不相交基因(disjoint gene)和过剩基因(excess gene)也是随机继承的。被取消的基因或许在未来的后代中重新被激活:有一个预置条件就是,如果继承的基因在一个 parent 中被取消,那么这个基因就会被取消。」[Stanley, Miikkulainen, Page 109, NEAT]


现在所有的东西已经差不多清楚了,NEAT 可以通过迭代和进化新的神经网络的方式在游戏中运行,以达到最佳的适应度评分。我特别推荐阅读一下这篇论文(论文摘要见下文),文章写得很棒,只要稍微 google 以下,新手也能够理解。但是如果你要来一个从头开始的课程,那你也可以看一下这个精彩视频:


NEAT 将复杂的问题分割成较小的、能够被优化的问题,来解决复杂问题,这真的很棒。NEAT 智能体可以开发来解决多种不同的子任务,然后联合起来解决更加复杂的问题。使用 NEAT 的一个例子就是新药品的创造:首先列出所有可能被用到的原子;然后,定义一个能够使仿真结果理解奖励系统的适应度函数;最后定义一套进化规则。另一个 NEAT 可以被用来选择生产新药物的制造技术。一旦这两个系统被结合在一起,一个促进成本效率优化的适应度函数就能创造出生产新药物的最佳方法。这在理论上听起来很棒,但是很明显,这在研发中是一个很复杂的问题,需要花费很多功夫。


论文:Evolving Neural Networks through Augmenting Topologies


地址:http://ift.tt/1ecaJ69


摘要:神经进化领域的一个重要问题是如何利用带有权重的进化神经网络拓扑。我们展示了一种方法,即通过增强拓扑的进化神经网络(NeuroEvolu- tion of Augmenting Topologies,NEAT),该方法在有挑战性的基准强化学习任务中的表现优于最好的固定拓扑(fixed-topology)方法。我们认为效率提升原因在于(1)部署一种不同拓扑交叉的方法,(2)使用物种形成(speciation)保护结构化创新,(3)从最小结构渐进增长。我们通过一系列烧蚀研究论证这一观点,这些研究表明每个模块对整个系统以及其他模块都是必需的。结果就是显著加快的学习。NEAT 还对 GA 有很大的贡献,因为它展示了进化既可以优化解决方案,也可以使之复杂化,这使得逐代进化出更加复杂的解决方案成为可能,并且强化了与生物进化的类比。


原文链接:http://ift.tt/2tEkQJ7


]]> 原文: http://ift.tt/2fNt0tk
RSS Feed

机器知心

IFTTT

详解Wassertein GAN:使用Keras在MNIST上的实现

在阅读论文 Wassertein GAN 时,我发现理解它最好的办法就是用代码来实现其内容。于是在本文中我将用自己的在 Keras 上的代码来向大家简要介绍一下这篇文章。


何为 GAN?


GAN,亦称为生成对抗网络(Generative Adversarial Network),它是生成模型中的一类——即一种能够通过观察来自特定分布的训练数据,进而尝试对这个分布进行预测的模型。这个模型新获取的样本「看起来」会和最初的训练样本类似。有些生成模型只会去学习训练数据分布的参数,有一些模型则只能从训练数据分布中提取样本,而有一些则可以二者兼顾。


目前,已经存在了很多种类的生成模型:全可见信念网络(Fully Visible Belief Network)、变分自编码器(Variational Autoencoder)、玻尔兹曼机(Boltzmann Machine),生成随机网络(Generative Stochastic Network),像素递归神经网络(PixelRNN)等等。以上的模型都因其所表征或接近的训练数据密度而有所区别。一些模型会去精细的表征训练数据,另一些则会以某种方式去和训练数据进行互动——比如说生成模型。GAN 就是这里所说的后者。大部分生成模型的学习原则都可被概括为「最大化相似度预测」——即让模型的参数能够尽可能地与训练数据相似。


GAN 的工作方式可以看成一个由两部分构成的游戏:生成器(Generator/G)和判别器(Discriminator/D)(一般而言,这两者都由神经网络构成)。生成器随机将一个噪声作为自己的输入,然后尝试去生成一个样本,目的是让判别器无法判断这个样本是来自训练数据还是来自生成器的。在判别器这里,我们让它以监督学习方式来工作,具体而言就是让它观察真实样本和生成器生成的样本,并且同时用标签告诉它这些样本分别来自哪里。在某种意义上,判别器可以代替固定的损失函数,并且尝试学习与训练数据分布相关的模式。


何为 Wasserstein GAN?


就其本质而言,任何生成模型的目标都是让模型(习得地)的分布与真实数据之间的差异达到最小。然而,传统 GAN 中的判别器 D 并不会当模型与真实的分布重叠度不够时去提供足够的信息来估计这个差异度——这导致生成器得不到一个强有力的反馈信息(特别是在训练之初),此外生成器的稳定性也普遍不足。


Wasserstein GAN 在原来的基础之上添加了一些新的方法,让判别器 D 去拟合模型与真实分布之间的 Wasserstein 距离。Wassersterin 距离会大致估计出「调整一个分布去匹配另一个分布还需要多少工作」。此外,其定义的方式十分值得注意,它甚至可以适用于非重叠的分布。


为了让判别器 D 可以有效地拟合 Wasserstein 距离:


  • 其权重必须在紧致空间(compact space)之内。为了达到这个目的,其权重需要在每步训练之后,被调整到-0.01 到+0.01 的闭区间上。然而,论文作者承认,虽然这对于裁剪间距的选择并不是理想且高敏感的(highly sensitive),但是它在实践中却是有效的。更多信息可参见论文 6 到 7 页。
  • 由于判别器被训练到了更好的状态上,所以它可以为生成器提供一个有用的梯度。
  • 判别器顶层需要有线性激活。
  • 它需要一个本质上不会修改判别器输出的价值函数。

K.mean(y_true * y_pred)

以 keras 这段损失函数为例:


  •  这里采用 mean 来适应不同的批大小以及乘积。
  •  预测的值通过乘上 element(可使用的真值)来最大化输出结果(优化器通常会将损失函数的值最小化)。


论文作者表示,与 vanlillaGAN 相比,WGAN 有一下优点:


  • 有意义的损失指标。判别器 D 的损失可以与生成样本(这些样本使得可以更少地监控训练过程)的质量很好地关联起来。
  • 稳定性得到改进。当判别器 D 的训练达到了最佳,它便可以为生成器 G 的训练提供一个有用的损失。这意味着,对判别器 D 和生成器 G 的训练不必在样本数量上保持平衡(相反,在 Vanilla GAN 方法中而这是平衡的)。此外,作者也表示,在实验中,他们的 WGAN 模型没有发生过一次崩溃的情况。


开始编程!


我们会在 Keras 上实现 ACGAN 的 Wasserstein variety。在 ACGAN 这种生成对抗网络中,其判别器 D 不仅可以预测样本的真实与否,同时还可以将其进行归类。


下方代码附有部分解释。


[1] 导入库文件:

import os  import matplotlib.pyplot as plt %matplotlib inline %config InlineBackend.figure_format = 'retina' # enable hi-res output  import numpy as np import tensorflow as tf  import keras.backend as K from keras.datasets import mnist from keras.layers import * from keras.models import * from keras.optimizers import * from keras.initializers import * from keras.callbacks import * from keras.utils.generic_utils import Progbar

[2].Runtime 配置

# random seed RND = 777  # output settings RUN = 'B' OUT_DIR = 'out/' + RUN TENSORBOARD_DIR = '/tensorboard/wgans/' + RUN SAVE_SAMPLE_IMAGES = False  # GPU # to run on GPU = "0"  BATCH_SIZE = 100 ITERATIONS = 20000  # size of the random vector used to initialize G Z_SIZE = 100

[3]生成器 G 每进行一次迭代,判别器 D 都需要进行 D_ITERS 次迭代。


  • 由于在 WGAN 中让判别器质量能够优化这件事更加重要,所以判别器 D 与生成器 G 在训练次数上呈非对称比例。
  • 在论文的 v2 版本中,判别器 D 在生成器 G 每 1000 次迭代的前 25 次都会训练 100 次,此外,判别器也会当生成器每进行了 500 次迭代以后训练 100 次。

D_ITERS = 5

[4]其它准备:

# create output dir if not os.path.isdir(OUT_DIR): os.makedirs(OUT_DIR)  # make only specific GPU to be utilized os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = GPU  # seed random generator for repeatability np.random.seed(RND)  # force Keras to use last dimension for image channels K.set_image_dim_ordering('tf')

[5]判别器的损失函数:


  • 由于判别器 D 一方面力图在训练数据分布与生成器 G 生成的数据之间习得一个 Wasserstein 距离的拟合,另一方面判别器 D 又是线性激活的,所以这里我们不需要去修改它的输出结果。
  • 由于已经使用了损失函数 Mean,所以我们可以在不同的批大小之间比较输出结果。
  • 预测结果等于真值(true value)与元素的点乘(element-wise multiplication),为了让判别器 D 的输出能够最大化(通常,优化器都力图去让损失函数的值达到最小),真值需要取-1。

def d_loss(y_true, y_pred):     return K.mean(y_true * y_pred)

[6].创建判别器 D


判别器将图像作为输入,然后给出两个输出:

  • 用线性激活来评价生成图像的「虚假度」(最大化以用于生成图像)。
  •  用 softmax 激活来对图像种类进行预测。
  • 由于权重是从标准差为 0.02 的正态分布中初始化出来的,所以最初的剪裁不会去掉所有的权重。


 def create_D():

     # weights are initlaized from normal distribution with below params     weight_init = RandomNormal(mean=0., stddev=0.02)      input_image = Input(shape=(28, 28, 1), name='input_image')      x = Conv2D(         32, (3, 3),         padding='same',         name='conv_1',         kernel_initializer=weight_init)(input_image)     x = LeakyReLU()(x)     x = MaxPool2D(pool_size=2)(x)     x = Dropout(0.3)(x)      x = Conv2D(         64, (3, 3),         padding='same',         name='conv_2',         kernel_initializer=weight_init)(x)     x = MaxPool2D(pool_size=1)(x)     x = LeakyReLU()(x)     x = Dropout(0.3)(x)      x = Conv2D(         128, (3, 3),         padding='same',         name='conv_3',         kernel_initializer=weight_init)(x)     x = MaxPool2D(pool_size=2)(x)     x = LeakyReLU()(x)     x = Dropout(0.3)(x)      x = Conv2D(         256, (3, 3),         padding='same',         name='coonv_4',         kernel_initializer=weight_init)(x)     x = MaxPool2D(pool_size=1)(x)     x = LeakyReLU()(x)     x = Dropout(0.3)(x)      features = Flatten()(x)      output_is_fake = Dense(         1, activation='linear', name='output_is_fake')(features)      output_class = Dense(         10, activation='softmax', name='output_class')(features)      return Model(         inputs=[input_image], outputs=[output_is_fake, output_class], name='D')


[7].创建生成器


生成器有两个输入:


  • 一个尺寸为Z_SIZE的潜在随机变量。
  • 我们希望生成的数字类型(integer o 到 9)。


为了加入这些输入(input),integer 类型会在内部转换成一个1 x DICT_LEN(在本例中DICT_LEN = 10)的稀疏向量,然后乘上嵌入的维度为 DICT_LEN x Z_SIZE的矩阵,结果得到一个维度为1 x Z_SIZE的密集向量。然后该向量乘上(点 乘)可能的输入(input),经过多个上菜样和卷积层,最后其维度就可以和训练图像的维度匹配了。

def create_G(Z_SIZE=Z_SIZE):     DICT_LEN = 10     EMBEDDING_LEN = Z_SIZE      # weights are initialized from normal distribution with below params     weight_init = RandomNormal(mean=0., stddev=0.02)      # class#     input_class = Input(shape=(1, ), dtype='int32', name='input_class')     # encode class# to the same size as Z to use hadamard multiplication later on     e = Embedding(         DICT_LEN, EMBEDDING_LEN,         embeddings_initializer='glorot_uniform')(input_class)     embedded_class = Flatten(name='embedded_class')(e)      # latent var     input_z = Input(shape=(Z_SIZE, ), name='input_z')      # hadamard product     h = multiply([input_z, embedded_class], name='h')      # cnn part     x = Dense(1024)(h)     x = LeakyReLU()(x)      x = Dense(128 * 7 * 7)(x)     x = LeakyReLU()(x)     x = Reshape((7, 7, 128))(x)      x = UpSampling2D(size=(2, 2))(x)     x = Conv2D(256, (5, 5), padding='same', kernel_initializer=weight_init)(x)     x = LeakyReLU()(x)      x = UpSampling2D(size=(2, 2))(x)     x = Conv2D(128, (5, 5), padding='same', kernel_initializer=weight_init)(x)     x = LeakyReLU()(x)      x = Conv2D(         1, (2, 2),         padding='same',         activation='tanh',         name='output_generated_image',         kernel_initializer=weight_init)(x)      return Model(inputs=[input_z, input_class], outputs=x, name='G')

[8].将判别器 D 和生成器 G 整合到一个模型中:

D = create_D()  D.compile(     optimizer=RMSprop(lr=0.00005),     loss=[d_loss, 'sparse_categorical_crossentropy'])  input_z = Input(shape=(Z_SIZE, ), name='input_z_') input_class = Input(shape=(1, ),name='input_class_', dtype='int32')  G = create_G()  # create combined D(G) model output_is_fake, output_class = D(G(inputs=[input_z, input_class])) DG = Model(inputs=[input_z, input_class], outputs=[output_is_fake, output_class])  DG.compile(     optimizer=RMSprop(lr=0.00005),     loss=[d_loss, 'sparse_categorical_crossentropy'] )


[9].加载 MNIST 数据集:

# load mnist data (X_train, y_train), (X_test, y_test) = mnist.load_data()  # use all available 70k samples from both train and test sets X_train = np.concatenate((X_train, X_test)) y_train = np.concatenate((y_train, y_test))  # convert to -1..1 range, reshape to (sample_i, 28, 28, 1) X_train = (X_train.astype(np.float32) - 127.5) / 127.5 X_train = np.expand_dims(X_train, axis=3)

[10].生成样本以及将指标和图像发送到 TensorBorad 的实用工具:

# save 10x10 sample of generated images def generate_samples(n=0, save=True):      zz = np.random.normal(0., 1., (100, Z_SIZE))     generated_classes = np.array(list(range(0, 10)) * 10)     generated_images = G.predict([zz, generated_classes.reshape(-1, 1)])      rr = []     for c in range(10):         rr.append(             np.concatenate(generated_images[c * 10:(1 + c) * 10]).reshape(                 280, 28))     img = np.hstack(rr)      if save:         plt.imsave(OUT_DIR + '/samples_%07d.png' % n, img, cmap=plt.cm.gray)      return img  # write tensorboard summaries sw = tf.summary.FileWriter(TENSORBOARD_DIR) def update_tb_summary(step, write_sample_images=True):      s = tf.Summary()      # losses as is     for names, vals in zip((('D_real_is_fake', 'D_real_class'),                             ('D_fake_is_fake', 'D_fake_class'), ('DG_is_fake',                                                                  'DG_class')),                            (D_true_losses, D_fake_losses, DG_losses)):          v = s.value.add()         v.simple_value = vals[-1][1]         v.tag = names[0]          v = s.value.add()         v.simple_value = vals[-1][2]         v.tag = names[1]      # D loss: -1*D_true_is_fake - D_fake_is_fake     v = s.value.add()     v.simple_value = -D_true_losses[-1][1] - D_fake_losses[-1][1]     v.tag = 'D loss (-1*D_real_is_fake - D_fake_is_fake)'      # generated image     if write_sample_images:         img = generate_samples(step, save=True)         s.MergeFromString(tf.Session().run(             tf.summary.image('samples_%07d' % step,                              img.reshape([1, *img.shape, 1]))))      sw.add_summary(s, step)     sw.flush() 


[11].训练


训练过程包含了以下步骤:


1、解除对判别器 D 权重的控制,让它们变得可学习。

2、调整判别器的权重(调整到-0.01 到+0.01 闭区间上)。

3、向判别器 D 提供真实的样本,通过在损失函数中将其乘上-1 来尽可能最大化它的输出,最小化它的值。

4、向判别器 D 提供假的样本试图最小化其输出。

5、按照上文讲述的判别器迭代训练方法重复步骤 3 和 4。

6、固定判别器 D 的权重。

7、训练一对判别器和生成器,尽力去最小化其输出。由于这种手段优化了生成器 G 的权重,所以前面已经训练好了的权重固定的判别器才会将生成的假样本判断为真图像。


progress_bar = Progbar(target=ITERATIONS)  DG_losses = [] D_true_losses = [] D_fake_losses = []  for it in range(ITERATIONS):      if len(D_true_losses) > 0:         progress_bar.update(             it,             values=[ # avg of 5 most recent                     ('D_real_is_fake', np.mean(D_true_losses[-5:], axis=0)[1]),                     ('D_real_class', np.mean(D_true_losses[-5:], axis=0)[2]),                     ('D_fake_is_fake', np.mean(D_fake_losses[-5:], axis=0)[1]),                     ('D_fake_class', np.mean(D_fake_losses[-5:], axis=0)[2]),                     ('D(G)_is_fake', np.mean(DG_losses[-5:],axis=0)[1]),                     ('D(G)_class', np.mean(DG_losses[-5:],axis=0)[2])             ]         )              else:         progress_bar.update(it)      # 1: train D on real+generated images      if (it % 1000) < 25 or it % 500 == 0: # 25 times in 1000, every 500th         d_iters = 100     else:         d_iters = D_ITERS      for d_it in range(d_iters):          # unfreeze D         D.trainable = True         for l in D.layers: l.trainable = True          # clip D weights          for l in D.layers:             weights = l.get_weights()             weights = [np.clip(w, -0.01, 0.01) for w in weights]             l.set_weights(weights)          # 1.1: maximize D output on reals === minimize -1*(D(real))          # draw random samples from real images         index = np.random.choice(len(X_train), BATCH_SIZE, replace=False)         real_images = X_train[index]         real_images_classes = y_train[index]          D_loss = D.train_on_batch(real_images, [-np.ones(BATCH_SIZE),            real_images_classes])         D_true_losses.append(D_loss)          # 1.2: minimize D output on fakes           zz = np.random.normal(0., 1., (BATCH_SIZE, Z_SIZE))         generated_classes = np.random.randint(0, 10, BATCH_SIZE)         generated_images = G.predict([zz, generated_classes.reshape(-1, 1)])          D_loss = D.train_on_batch(generated_images, [np.ones(BATCH_SIZE),           generated_classes])         D_fake_losses.append(D_loss)      # 2: train D(G) (D is frozen)     # minimize D output while supplying it with fakes,      # telling it that they are reals (-1)      # freeze D     D.trainable = False     for l in D.layers: l.trainable = False      zz = np.random.normal(0., 1., (BATCH_SIZE, Z_SIZE))      generated_classes = np.random.randint(0, 10, BATCH_SIZE)      DG_loss = DG.train_on_batch(         [zz, generated_classes.reshape((-1, 1))],         [-np.ones(BATCH_SIZE), generated_classes])      DG_losses.append(DG_loss)      if it % 10 == 0:         update_tb_summary(it, write_sample_images=(it % 250 == 0))


结论


视频的每一秒都是 250 次训练迭代。使用 Wasserstein GAN 的一个好处就是它有着损失与样本质量之间的关系。如我们在下方看到的损失图,当进行了约 8000 次训练之后,损失开始逼近 0,在视频中 32 秒位置时,我们已经开始可以看到像样的图像了。




附论文地址:http://ift.tt/2phuvGh


参考文献

1. Wasserstein GAN paper (http://ift.tt/2phuvGh) – Martin Arjovsky, Soumith Chintala, Léon Bottou

2. NIPS 2016 Tutorial: Generative Adversarial Networks (http://ift.tt/2i2wZAB) – Ian Goodfellow

3. Original PyTorch code for the Wasserstein GAN paper (http://ift.tt/2kOCS6C)

4. Conditional Image Synthesis with Auxiliary Classifier GANs (http://ift.tt/2y0fhch) – Augustus Odena, Christopher Olah, Jonathon Shlens

5. Keras ACGAN implementation (http://ift.tt/2xV2bvv) – Luke de Oliveira

6. Code for the article (http://ift.tt/2y0zzm6)


原文链接:http://ift.tt/2hsV2yp


]]> 原文: http://ift.tt/2y0FN5g
RSS Feed

机器知心

IFTTT

一文看尽Google新品发布会:手机、音箱、笔记本,硬件全面AI化

李根 若朴 发自 十一假期

量子位 报道 | 公众号 QbitAI

AI+软件+硬件,让Google助手无处不在。

这是Google刚刚结束的产品发布会的核心旋律——开门见山、贯穿始终。Google预测:下一次的伟大飞跃,将发生在AI、软件和硬件的交叉路口。

那在这个伟大飞跃前夜,Google都发布了什么?量子位带你一文看尽、一文看懂。

AI为先(AI First)

Google公司CEO劈柴哥(Sundar Pichai)第一个登场。

他首先谈到了最近美国遇到的几个灾难性事件。接着劈柴哥(再次)开始讲述,Google如何从移动为先(Mobile First),转变为AI为先(AI First)。

他举了几个例子,例如如何利用AI和机器学习在非洲处理街景和地图,以及机器学习如何分析旧金山哪些停车场可能还有车位。当然最好的例子是Google翻译。Google现在每天提供超过20亿次的翻译,与2014年相比翻了一番。

怎么理解AI为先的转变?

这里有四个关键组成部分:1)交流和感知(声音、触觉、视觉等);2)环境、多设备可用,无论在手机还是汽车上都能触达;3)不需要你开口问,就能提供你所需要的信息;4)同样不需要你开口问,电脑就能学习和适应你。

"在AI为先的世界里,电脑应该去适应人们的生活方式,而不是人们适应电脑",劈柴哥在台上表示:"我们对这种转变感到兴奋"。

接着开始讲AutoML,这在此前的I/O大会上也讲过。AutoML意在让机器学习模型的设计变得更简单,整个过程更加自动化,有望极大降低未来机器学习的门槛。

劈柴哥举例说,AutoML把图像分类的精确度,从81.5%提升到82.3%,而计算量也有了显著地下降。"AI进步的速度是惊人的",他说。

未来Google还会把更多AI和机器学习技术应用在日常的服务中。

接下来是新硬件时间~

智能音箱新成员:Mini和Max

新硬件发布之前,小结了一下过去的成绩:全球Chromecast设备已经有5500万台;虚拟助手Google助手去年回答了1亿个问题。智能音箱Google Home下一步将进入日本市场——这也是Google Home登陆的首个非拉丁语系国家。

在这次发布会上,智能音箱家族增加两个新成员。更迷你的Google Home Mini,和体型更巨大的Google Home Max。

Google Home Mini是一个饼状的智能音箱,织物表面下有可以亮起的LED灯,可以播放360°的声音,也有支持远场语音技术的麦克风。

颜色方面有灰白、炭黑和珊瑚红三种,售价49美元,10月19日开售。对于这款Mini的思考,Google的说法是"每个房间都可以放一个"。

Google Home Mini

大块头Google Home Max则可以提供更好的音质,配备两个4.5英寸高偏差低音扬声器,以让用户获得更加深度平衡的低音,整体音量则可以比Google Home大20倍。

另外,即便在播放音乐的时候,这个产品也能听到你的指令。这是第一款支持Smart Sound的Google智能音箱,可以根据环境、位置等即刻调整音效。Max也被赋予了"AI音频"体验,它能适应用户具体放置的环境,视具体放置位置自动调整声音。

此外,Max也接入了各种音乐服务,支持蓝牙和辅助端口,共有灰白和炭黑2种颜色,售价399美元,12月份上市销售。

总体来说,Google Home Max主要针对苹果的HomePod、Sonos等对手,当然除了硬件,最大的卖点还是软件方面的Google助手。

Google Home系列

最后,Google Home全家桶到齐后,Google方面还称,内置的Google助手也将有三大新功能:

1)更智能服务日常生活,比如早上醒来一声"hi Google,早上好",就能得到关于用户一天的个性化时间表、通勤状况、天气和新闻;

2)家庭功能,特别是更多涉及儿童的内容,13岁以下的儿童都可以由父母创建一个专属帐户;

3)智能家居,目前Google Home可以控制的智能家居产品达1000个,涉及100多个品牌。

笔记本:Pixelbook

接下来发布的是首款Google笔记本,一款名为Google Pixelbook的高性能Chromebook,结合了笔记本电脑的性能、平板电脑的便携,以及智能手机的个性化。

笔记本外观之下,是用AI技术打通PC和智能手机的想法。在Google Pixelbook上,除了定制的Chrome OS主打快速、易用和安全,还搭载了Google助手,直接语音交互,而且最关键的是,可以应用所有Google play应用商店里的App。

Google Pixelbook

硬件方面,厚10.3mm,重1.1kg,4合1设计,可拆卸键盘,能360°翻转,采用英特尔酷睿i5和i7处理器,最高512GB存储,10小时续航。

售价999美元起,今天开始接受预定,首批面向美国、加拿大和英国三个国家。

同时配套发布的还有Google Pixelbook pen,主要加强笔记本上的交互,使用机器学习进行手写识别,最多10毫秒延时,售价99美元起。

值得注意的是,这是首款搭载Google助手的笔记本电脑,而且可以直接在电脑上使用App,无需再在手机和笔记本之间进行切换。

手机:Google Pixel 2/2XL

接下来是意料之中、曝光最充分的新手机:5英寸的Google Pixel 2和6英寸的Google Pixel 2XL。

Google Pixel 2 / XL

硬件方面,Google Pixel 2是一代的性能升级,而新增的Google Pixel 2XL则配备了18:9的1080p OLED全面屏。这两款产品均是后置指纹、前后各一个摄像头、采用Type-C,且取消了耳机孔。

颜色方面,Google Pixel 2有浅蓝色、黑色和黑白色3种颜色,Google Pixel 2XL则仅有黑色和黑白色2款。不过颜色上也能通过合作方配件玩一些新花样,目前有25家合作伙伴可以搞一些徽章、背壳等个性化方案。

系统方面,Google Pixel 2和Google Pixel 2XL均配备Android 8.0 Oreo。值得一提的还有一个永远在线的显示屏,无需触摸电源按钮,就能了解所有屏幕上的通知/时间。

当然,Google的手机,核心大招都在软件方面,或者说就是AI在手机上应用。

首先还是Google助手,贯穿整个手机使用中,甚至不用唤醒词,直接能在锁屏状态下识别"主人"的声纹,启动相应App或执行具体任务,现场演示了一下"自拍",只需对着麦克风轻声细语一句,Google助手便直接启动相机,并开启自拍模式。这个功能被称为"Active Edge"。

Google Lens Demo

其次是相机,主要有拍照、Google Lens和AR等3大技术应用。

即便在双摄像头成为标配的时代,Google Pixel 2也没有跟风,核心原因是Google团队认为算法能解决的问题,就不劳烦硬件了。

于是这颗后置单摄像头,在Google机器视觉和机器学习的双驱动下,性能比上一代更好,拍照评分从去年的89分提升到了98分——自己创造的记录自己刷新。

此外,这颗摄像头还能在Google Lens的赋能下,让所有的图片、图像信息结构化,比如实时机器翻译;又比如OCR式的图片信息转文字;还有"搜索看到的一切",用户可以在拍下照片的同时,获得相关知识信息,也能通过点击Google相册中的镜头图标来查看地标、书籍、音乐专辑、电影和作品。

Google方面称,未来Google助手中也会加入Lens技术的应用,即直接语音交互完成更多视觉相关功能。

最后还有AR的应用,靠单摄像头,Google Pixel 2就能在家居、游戏等需求中玩转AR。

当然,在Google发布会上,这颗摄像头还有"最快对焦"、四轴防抖、3秒动图拍摄和4K视频录制等能力。

至于拍照之后的免费的无限制的Google云处理,也是附赠的。

总结起来一句话:当所有手机厂商都在把摄像头往美颜方向带时,Google的做法是让摄像头做更多、更实用,而且软件算法能搞定的事儿,决不堆叠硬件。

新手机售价,Google Pixel:2649美元;Google Pixel 2XL:849美元,发布会之后就开售。全球市场来讲,Google Pixel 2离我们最近的开售市场是印度,Google Pixel 2XL则是新加坡。

翻译耳机

新手机之后,Google还推出了配备新耳机的VR产品Google Daydream View,售价99美元,灰、黑和珊瑚红三种颜色,以及买硬件就免费享受所有YouTube的VR资源。

Google Daydream View

不过更激动人心的是一款"翻译耳机"的新产品,名为Google Pixel Buds。

Pixel Buds

Buds外观为无线耳机的形式,把Google助手和Google翻译内置其中,不仅能够读取信息,还支持实时翻译,支持的互译语种达到40种。

其实类似功能的产品中国早已有之,比如讯飞的晓译翻译机,以及与腾讯合作的耳机形态的"时空壶"。

Buds一共有黑、白和蓝三种颜色,5小时续航,还能类似苹果的AirPods,直接通过耳机盒充电,最长续航达24小时。

Pixel Buds充电盒

翻译耳机售价:美国市场159美元,即刻预售,11月份开始也将面向加拿大、英国、德国、澳大利亚和新加坡市场。

归结起来,Pixel Buds是Google把Google助手的所有功能装入"无线耳机"的结果,而且不用掏出手机,就能享受实时翻译。

One More Thing:Google Clips

Google Clips

最后登场的新产品是一款相机,或可以称为"随身记录仪",名为Google Clips。

这是一款类似行车记录仪、家庭记录仪的产品,但更为轻便,甚至可以随身携带,拍摄以图片和几秒的动图为主。

除此之外,最核心的还是软件方面的能力。一是Google云的赋能,无限存储空间,实时同步;二是Google机器学习能力,一方面通过面部识别可以抓拍到清晰稳定的镜头,另一方面是整个机器学习过程就在硬件端本身完成,也就意味着一切都是实时同步进行的,不需要"后期"。

Google Clips拍摄

当然,也可以在Pixel、三星S8和iPhone(6以上)查看,但在Google自家的Pixel手机上,能直接通过Google助手交互、查找。

Clips售价249美元,目标群体是父母和宠物主。具体开售时间未定,只说会尽快。

最后的最后,如果要对这场Google产品发布会做一个概括,大概会有两个感想:

首先,"AI+软件+硬件",会经由Google发起,被更多带入我们的生活,而现阶段Google的"AI+软件+硬件",就是把Google助手装入每一个硬件产品中。

其次,这些产品,无论多么激动人心,暂时与中国用户无缘。

不过,Google在总结时也说:硬件业务才刚刚开始,我们志在长远未来。

最后还有一个官方1分钟视频回顾:

— 完 —

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 http://ift.tt/2ypg8F7
RSS Feed

RSS5

IFTTT

LangChain 彻底重写:从开源副业到独角兽,一次“核心迁移”干到 12.5 亿估值 -InfoQ 每周精要No.899期

「每周精要」 NO. 899 2025/10/25 头条 HEADLINE LangChain 彻底重写:从开源副业到独角兽,一次"核心迁移"干到 12.5 亿估值 精选 SELECTED 1000 行代码手搓 OpenAI gpt-oss 推理引...