2017年10月1日星期日

新型池化层sort_pool2d实现更快更好敛:表现优于最大池化层(附代码实现)

近日,Sahil Singla 在 Medium 上发表了一篇题为《A new kind of pooling layer for faster and sharper convergence》的文章,提出一种可实现更快更好收敛的新型池化层 sort_pool2d,表现优于最大池化层,同时解决了最大池化层无法使用来自多层激活函数信息的问题,以及反向传播只会提升最大池化的激活函数的问题。作者还给出了该池化层的代码实现。作者表示,介绍此研究的论文将会提交至 arXiv 上。
  • sort_pool2d 代码:http://ift.tt/2fAlkdA
  • sort_pool2d 实现:http://ift.tt/2yfB0hM


现在的最大池化层(应用于当前几乎所有顶级的计算机视觉任务,甚至是一些 NLP 任务中)大约去掉了 75% 的激活函数。本文试图设计一种新型池化层 sort_pool2d,摆脱与之关联的一些问题。


问题如下:


  1. 空间信息损失:当去掉 75% 的激活函数时,关于其来源的信息就会丢失。
  2. 最大池化层无法使用来自多层激活函数的信息。
  3. 反向传播只会提升最大池化的激活函数,即使其他激活函数的值可能出现错误。

本文想要设计一种新型池化层,尽可能多地解决这些问题。在这一过程中,我想出了一个非常简单的技巧,可以解决问题 2 和 3。


想法与动机


按照渐增的顺序排列 4 个激活函数,而不是选择最大的那个。用 4 个权重 [w1,w2,w3,w4] 与之相乘,并添加 4 个值。


这一想法背后的动机也非常简单:


用这种方式,网络依然能够学习对应于 [w1,w2,w3,w4] = [1,0,0,0] 的良好的、旧的最大池化。

后面的层可以获取更多信息。因此,在非最大激活函数可用于降低损失函数时,网络只可学习使用其他值。


梯度流过上一层中的所有 4 个值(相比之下,最大池化层只有一个值)。


因此我希望基于上述原因,这一想法能够比最大池化层做的更好。这是一个非常少见的深度学习实验,其结果与我设想的简直一模一样。


具体定义


设池化之前的层的输出为张量 T,大小为 [B, H, W, C]。定义一个超参数 pool_range,它可以是 [1,2,3,4] 中的任意一个。pool_range 指定激活函数(按照排列顺序保存)的数量。假设要被池化的张量 T 有 4 个激活函数,我首先按照 [a1, a2, a3, a4] 的顺序排列它们,其中 a1 ≥ a2 ≥ a3 ≥ a4。接着保留其中的第一个 pool_range,我称之为激活向量。

我将 pool_range 的权重向量定义为 [w{1},.... w{pool_range}]。这里需要注意的是,如果这些权重中的任何一个是负值,则激活向量按强度排序且采用加权平均的假设将不成立。因此,我没有直接使用权重,而是在权重向量上取一个 softmax,并将结果乘以激活向量。为了证明添加 softmax 的重要性,我在 cluttered-mnist 数据集上进行了一个 toy experiment,当 pool_range=3 时看看有无 softmax 的区别。以下是测试数据集上的结果:



cluttered-mnist 数据集测试数据上的精确度(accuracy)对比与交叉熵对比


很明显,softmax 在这里是赢家。


我本来还可以对不同的通道使用不同的权重,但是为了便于与最大池化进行对比,我在不同通道上使用了 4 个相同的权重。


实现细节


我在 TnsorFlow 中写了该层的代码。TnsorFlow 的 top_k 层在 CPU 上非常快但是在 GPU 上非常慢。为了对这 4 个浮点数进行排序,我亲自写了程序。测试 sort_pool2d 的代码请参见 http://ift.tt/2fDoq0I http://ift.tt/2x8OTOQ


结果


我在不同的数据集和架构上尝试了这一想法,发现其性能全部优于基线最大池化。所有实验使用 pool_range 的 4 个值:1,2,3,4。pool_range=1 对应最大池化。


以下是我的实验结果:


cluttered-mnist


cluttered-mnist 和 fashion-mnist 上的 toy experiment



cluttered-mnist 数据集训练数据上的精确度与交叉熵对比



cluttered-mnist 数据集测试数据上的精确度与交叉熵对比



测试数据训练中的最佳精确度与交叉熵的值


网络获得的训练损失和精确度是相同的,但是 pool_range = 2,3,4 的验证精确度要远好于标准的最大池化。


fashion-mnist


fashion-mnis 数据集训练数据上的精确度与交叉熵对比



fashion-mnis 数据集测试数据上的精确度与交叉熵对比



训练过程中,测试数据上的最优精确度和交叉熵的值


pool_range>1 时,结果要好得多。


当前最佳模型上的实验


resnet 上的 cifar-100



cifar-10 数据集训练数据上的精确度与交叉熵对比



cifar-10 数据集测试数据上的精确度与交叉熵对比



训练过程中,测试数据上的最优精确度与交叉熵的值


pool_range>1 时,结果更好。


resnet 上的 cifar-100



在 cifar-100 数据集训练数据上的精确度与交叉熵对比



在 cifar-100 数据集测试数据上的精确度与交叉熵对比



训练过程中,在测试数据上的最优精确度与交叉熵的值


pool_range>1 时,结果更好。这里的结果优于 cifar-10 的结果,因为 cifar-10 拥有的每个类别的数据较少。这表明这个想法对解决每个类别数据较少的问题效果很好。


匹配网络中的 omniglot


我尝试使用论文《Matching Networks for one shot learning》提出的架构在 omniglot 数据集上对比 20 种方式的一次分类结果。



omniglot 数据集训练数据上的精确度与损失对比



omniglot 数据集验证数据上的精确度与损失对比



训练过程中,在验证数据上最优精确度与损失的值


注意:该实现使用该论文提出的已正则化的当前最佳的实现。因此,这些改进超过很多现有技巧。


论文《学习记忆罕见事件》(Learning to Remember Rare Events)中的 omniglot


我尝试使用《学习记忆罕见事件》论文中提出的架构在 omniglot 数据集上对比 5 种方式的一次分类结果。



omniglot 数据集验证数据上的损失对比



一次和二次分别在 omniglot 数据集验证数据上的精确度对比


pool_range=2、pool_range=4 时的收敛比使用基线最大池化要快得多。


这次加速再次超越该论文当前最佳的实现结果。因此这些改进超过很多现有技巧。


重现结果的代码和命令行参数

  • 所有实验可以从该 repo 中重现(地址:http://ift.tt/2x8XrFd
  • 重现 cluttered-mnist 和 fashion-mnist 数据集上结果的命令行参数地址:http://ift.tt/2fDouO0
  • 重现使用 resnet 架构在 cifar10 和 cifar100 上的结果的命令行参数地址:http://ift.tt/2fDouO0
  • 重现使用《Matching Networks for one shot learning》提出的架构在 omniglot 上的结果的命令行参数地址:http://ift.tt/2x8OYlC
  • 重现使用《学习记忆罕见事件》提出的架构在 omniglot 上的结果的命令行参数地址:http://ift.tt/2fE7Ayq


结论


这一池化层(我将其称之为 sort_pool2d)在所有数据集和架构中的表现大大优于 max_pool2d。而计算时间的优势也很大。通过编写高度优化的 C 语言代码和 CUDA 代码,我们还可以进一步优化每次迭代的时间。


虽然这一方式并不能解决空间信息丢失的问题。但是它为解决这个问题提出了一个很有意义的方向。



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

机器知心

IFTTT

从零开始:深度学习软件环境安装指南

在搭建深度学习机器之后,我们下一步要做的就是构建完整的开发环境了。本文将向你解释如何在一台新装的 Ubuntu 机器上安装 Python 和 Nvidia 硬件驱动、各类库和软件包。


为了进行强化学习研究,我最近购置了一台基于 Ubuntu 和英伟达 GPU 的深度学习机器。尽管目前在网络中能找到一些环境部署指南,但目前仍然没有全面的安装说明。另外,我也不得不阅读了很多文档来试图理解安装细节——其中的一些并不完整,甚至包含语法错误。因此,本文试图解决这个问题,提供一个详尽的软件环境安装指南。


本文将指导你安装


  • 操作系统(Ubuntu)
  • 4 种驱动和库(GPU 驱动、CUDA、cuDNN 和 pip)
  • 5 种 Python 深度学习库(TensorFlow、Theano、CNTK、Keras 和 PyTorch)


这些软件之间的互相依赖关系如下图所示。其中,你只需要安装一种深度学习库,请自由选择。



深度学习软件安装和依赖示意图


以下是各个软件的细节介绍:


  1. Ubuntu(v16.04.3)——操作系统,各种任务处理。
  2. Nvidia GPU 驱动(v375)——允许系统获得 GPU 带来的加速。
  3. CUDA(v8.0)——GPU C 语言库。「计算同一设备架构」。
  4. cuDNN(v6.0.21)——基于 CUDA 的深度学习基元库。「CUDA 深度学习库」。
  5. pip(v9.0.1)——Python 安装包。「Pip 安装包」。
  6. TensorFlow(v1.3)——谷歌开发的深度学习框架。
  7. Theano(v0.9.0)——此前由 MILA 负责维护的深度学习框架。
  8. CNTK(v2.2)——微软研究院开发的深度学习框架。
  9. Keras(v2.0.8)——深度学习包装可互换后端。可与 TensorFlow、Theano 和 CNTK 共同使用。
  10. PyTorch(v0.2.0)——可被 GPU 加速的动态图深度学习框架,主要由 Facebook 的研究人员负责开发。


1. 安装 Ubuntu 16.04.3


v 16.04.3 可由 USB 启动的方式安装,它是最新的 LTS(长期支持)版本。首次在电脑上启用时,请在 BIOS 中选择由 USB 引导启动。


我的电脑中有两块硬盘——一块 1TB 的 SATA 和一块 256GB 的 SSD。在我的设想中,Ubuntu 被安装在常规硬盘中,固态硬盘(SSD)用于处理数据集和加速训练。在安装过程中,在屏幕中的 Installation Type 中选择 Something else,随后我们要进行三个分区操作:


  • 引导分区(128GB):包含系统文件、程序设置和文档。
  • 交换分区(2 倍的内存大小):对于我来说这就是 128GB。这块分区的容量用于扩展 Kernel RAM 作为虚拟内存使用。
  • 用户分区(剩下的部分):1TB 的硬盘剩下的空间大约还有 744GB。


在安装后,最好先运行以下命令来升级内核版本。


  1. sudo apt-get update

  2. sudo apt-get upgrade


Reference:http://ift.tt/2u6MwJf


2. 安装英伟达 GPU 驱动


在安装完 Ubuntu 后,你可能会发现屏幕的分辨率不对,而且不能修改,这是因为现在还没有安装 GPU 驱动。


安装驱动有两种方法:从 Ubuntu 资源库和数据源。第一个方法更加容易,但需要频繁的重新安装。使用 sudo apt-get update 和 sudo apt-get upgrade 指令后,系统的内核可以自动升级。但这样并不会更新英伟达驱动,可能会导致 GUI 无法正确加载。从数据源安装可以避免这个问题。


从安装包里安装 v375 驱动(简单的方法)


以下命令会将与你系统相兼容的驱动版本显示出来,它会提供两个版本号:最新的不稳定版和长期稳定版。版本号会从头列起,所以你需要把页面滚到最上面。


  1. sudo add-apt-repository ppa:graphics-drivers/ppa


添加并安装资源库。通过第二个命令,改变你想要安装的。我们在这里推荐安装最新的长期稳定版本——375 版。


  1. sudo apt-get update

  2. sudo apt-get install nvidia-


重启计算机以重新配置视频输出。


  1. sudo shutdown -r now


要测试驱动程序是否工作,Screen Display(SUPERKEY,屏幕显示类型)现在应该可以识别你使用的显示器了,你可以修改设置、分辨率与方向。


Reference:http://ift.tt/1DNcS3o


从英伟达网站安装 v384.90(较难的方法)


从英伟达网站下载最新的驱动程序版本。基于硬件配置,我选择的选项是:


GeForce -> GeForce 10 Series -> GeForce GTX 1080 -> Linux 64 bit -> English (UK)


可选条件:编译到 32 位架构和 GUI 的开发版本。


  1. sudo apt-get install gcc-multilib xorg-dev


按 CTRL + ALT + F1 键登录,从 GUI 转至终端。为了重建视频输出,必须先将其暂停。


  1. sudo service lightdm stop


如果命令行没有效果,Ubuntu 新版本使用 systemctl 替换 lightdm。然后使 runfile 可执行,并运行它。


  1. cd

  2. chmod +x NVIDIA-Linux-x86_64-384.90.run

  3. sudo ./NVIDIA-Linux-x86_64-384.90.run --dkms


运行时,你可能会收到一条 pre-install script failed 信息。这没什么影响,因为预安装脚本包含命令 exit 1,其目标是确保你真的想安装驱动程序。


选项--dkms(默认开启)在 kernel 自行更新时将驱动程序安装至模块中,从而阻止驱动程序重新安装。在 kernel 更新期间,dkms 触发驱动程序重编译至新的 kernel 模块堆栈。


如果安装失败,则原因在于计算机的 BIOS 未关闭 Secure Boot。重启电脑,在 BIOS 选项中关闭 Secure Boot。


如果安装成功,则可以重启 GUI。


  1. sudo service lightdm start


卸载:sudo ./NVIDIA-Linux-x86_64-384.90.run --uninstall


验证


确保以下命令能够识别正确的 GPU 版本


  1. nvidia-smi


确保驱动程序版本号与你安装的一致


  1. cat /proc/driver/nvidia/version


3. 安装 CUDA 8.0


从英伟达网站,使用下列系统属性下载 CUDA 的 runfile(地址:http://ift.tt/2xRnqjr


Linux -> x86_64 -> Ubuntu -> 16.04 -> .deb(network)


导航至.deb 文件的位置后,将该文件解压缩,更新软件包列表,使用下列命令安装 CUDA。


  1. sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb

  2. sudo apt-get update

  3. sudo apt-get install cuda


将库添加至 bash path,这样就可以使用其他应用找到库了。


  1. echo 'export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}' >> ~/.bashrc

  2. echo 'export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc

  3. source ~/.bashrc


验证时,使用 nvcc -V 确保 Nvidia C Compiler(nvcc)版本与 CUDA 的版本匹配。


重启电脑 sudo shutdown -r now,完成安装。


可选操作:测试 CUDA 安装


测试安装的一个方法是运行一些示例。以下命令行创建了一个存储示例程序的 test_CUDA 目录。


  1. mkdir test_CUDA

  2. cd test_CUDA

  3. ./cuda-install-samples-8.0.sh .

子目录 NVIDIA_CUDA-8.0_Samples/3_Imaging/cudaDecodeGL 中是 findgllib.mk 文件。该文件的第 61 行 30 列包含了英伟达驱动程序的硬编码值,该值应从 367 更改成你安装的驱动程序版本号。


编译示例


  1. cd ../.. && make

你现在可以在 NVIDIA_CUDA-8.0_Samples 内随意运行示例。你可以在 NVIDIA_CUDA-8.0_Samples/bin/x86_64/linux/release 中找到两个非常有用的脚本:./deviceQuery 可以在使用过程中打印 GPU,./bandwidthTest 可以打印它的带宽。


Reference:http://ift.tt/2qGIMgl


4. 安装 cuDNN 6.0.21


在英伟达网站上注册开发者项目,同意条款。从下拉菜单中选择 cuDNN v6.0.21 (April 27, 2017), for CUDA 8.0,并下载:


  1. cuDNN v6.0 Runtime Library for Ubuntu16.04 (Deb)
  2. cuDNN v6.0 Developer Library for Ubuntu16.04 (Deb)
  3. cuDNN v6.0 Code Samples and User Guide for Ubuntu16.04 (Deb)


.deb 优先于.tar,因为.deb 格式更适用于 Ubuntu,可以进行更纯净的安装。使用下列命令安装这三个包:


  1. sudo dpkg -i libcudnn6_6.0.21-1+cuda8.0_amd64.deb

  2. sudo dpkg -i libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb

  3. sudo dpkg -i libcudnn6-doc_6.0.21-1+cuda8.0_amd64.deb


测试 cuDNN


将已安装的示例复制到可读目录,然后编译并运行 mnistCNN。


  1. cp -r /usr/src/cudnn_samples_v6/ $HOME

  2. cd $HOME/cudnn_samples_v6/mnistCUDNN

  3. make clean && make

  4. ./mnistCUDNN


如果一切顺利,脚本应该会返回一条 Test passed! 消息。


卸载 cudnn


使用以下命令卸载三个库。另外,如果你已经创建了样本,那么再加上 rm -r ~/cudnn_samples_v6。


  1. sudo apt-get remove libcudnn6

  2. sudo apt-get remove libcudnn6-dev

  3. sudo apt-get remove libcudnn6-doc

Reference:cuDNN Installation Guide cuDNN Installation Guide(http://ift.tt/2xQAfdA


5. 安装 pip 9.0.1


Pip 的升级非常频繁,几乎每两周一次,建议使用最新版本的 pip。


请使用以下命令安装和升级最新版本的 pip。


  1. sudo apt-get install python-pip python-dev

  2. sudo pip install --upgrade pip


验证:请确保键入 pip -V 后可以打印出版本号。


6. 安装 Tensorflow 1.3.0


  1. pip install tensorflow-gpu


验证:启动$ python,确认是否以下脚本能够打印出 Hello, Tensorflow!


  1. import tensorflow as tf

  2. hello = tf.constant('Hello, TensorFlow!')

  3. sess = tf.Session()

  4. print(sess.run(hello))


Reference:http://ift.tt/2lpZTQj


7. 安装 Theano 0.10


Theano 需要的系统环境:


  1. sudo apt-get install libopenblas-dev cmake git


此外还要遵循 Python 的系统需求。


  1. sudo pip install numpy scipy nose sphinx pydot-ng pycuda scikit-cuda cython


libgpuarray 可以让 Theano 使用 GPU,它必须从源编译。首先下载源代码


  1. git clone http://ift.tt/2wV5c1x

  2. cd libgpuarray


将其编译为一个名为 Build 的文件夹。


  1. mkdir Build

  2. cd Build

  3. cmake .. -DCMAKE_BUILD_TYPE=Release

  4. make

  5. sudo make install


随后将其编译成一个 Python 包。


  1. cd ..

  2. python setup.py build

  3. sudo python setup.py install


将下面一行添加至 ~/.bashrc,这样 Python 就可以找到库了。


  1. export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH


最后,安装 Theano


  1. sudo pip install git+http://ift.tt/2yGzQJi


验证:创建测试文件 test_theano.py,其中的内容复制自:http://ift.tt/2xRiURY

随后看看 THEANO_FLAGS=device=cuda0 python test_theano.py 在使用了 GPU 之后是否成功。

Reference: Theano 0.9.0 documentation(http://ift.tt/2fJjuuX


8. 安装 CNTK 2.2


  1. sudo pip install http://ift.tt/2wV5d5B

验证:输入 python -c "import cntk; print(cntk.__version__)",输出 2.2。

Reference: Setup CNTK on your machine(http://ift.tt/2fJSn2O


9. 安装 Keras 2.0.8


  1. sudo pip install keras

验证:检查$ python 中的 import keras 是否成功。

Reference: Keras Installation(http://ift.tt/2yjgTiM


10. 安装 PyTorch 0.2.0


PyTorch 运行在两个库上: torchvision 和 torch,我们需要这样安装:

  1. sudo pip install http://ift.tt/2fJjvz1

  2. 0.2.0.post3-cp27-cp27mu-manylinux1_x86_64.whl

  3. sudo pip install torchvision

验证:以下脚本能够打印出一个带有随机初始浮点数的张量。

  1. from __future__ import print_function

  2. import torch

  3. x = torch.Tensor(5, 3)

  4. print(x)

Reference: http://pytorch.org/


结论


目前为止,整个过程中最难的部分是找出 Nvidia 驱动和深度学习包之间的依赖关系,以及最有效的长期安装过程。而最简单的部分是安装 Python,安装包和文档都得到了良好的维护。

虽然阅读文档和源代码都非常耗费时间,但了解每个软件包的构建和功能是非常具有启发性的,它也可以帮助我们理解整个 Ubuntu 生态系统。


希望本文对你有所帮助。 

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

机器知心

IFTTT

如何判断LSTM模型中的过拟合和欠拟合

判断长短期记忆模型在序列预测问题上是否表现良好可能是一件困难的事。也许你会得到一个不错的模型技术得分,但了解模型是较好的拟合,还是欠拟合/过拟合,以及模型在不同的配置条件下能否实现更好的性能是非常重要的。


在本教程中,你将发现如何诊断 LSTM 模型在序列预测问题上的拟合度。完成教程之后,你将了解:

  • 如何收集 LSTM 模型的训练历史并为其画图。
  • 如何判别一个欠拟合、较好拟合和过拟合的模型。
  • 如何通过平均多次模型运行来开发更鲁棒的诊断方法。


让我们开始吧。


教程概览


本教程可分为以下 6 个部分,分别是:

1. Keras 中的训练历史

2. 诊断图

3. 欠拟合实例

4. 良好拟合实例

5. 过拟合实例

6. 多次运行实例


1. Keras 中的训练历史


你可以通过回顾模型的性能随时间的变化来更多地了解模型行为。


LSTM 模型通过调用 fit() 函数进行训练。这个函数会返回一个叫作 history 的变量,该变量包含损失函数的轨迹,以及在模型编译过程中被标记出来的任何一个度量指标。这些得分会在每一个 epoch 的最后被记录下来。


  1. ...

  2. history = model.fit(...)


例如,如果你的模型被编译用来优化 log loss(binary_crossentropy),并且要在每一个 epoch 中衡量准确率,那么,log loss 和准确率将会在每一个训练 epoch 的历史记录中被计算出,并记录下来。


每一个得分都可以通过由调用 fit() 得到的历史记录中的一个 key 进行访问。默认情况下,拟合模型时优化过的损失函数为「loss」,准确率为「acc」。


  1. ...

  2. model.com pile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

  3. history = model.fit(X, Y, epochs=100)

  4. print(history.history['loss'])

  5. print(history.history['acc'])


Keras 还允许在拟合模型时指定独立的验证数据集,该数据集也可以使用同样的损失函数和度量指标进行评估。


该功能可以通过在 fit() 中设置 validation_split 参数来启用,以将训练数据分割出一部分作为验证数据集。


  1. ...

  2. history = model.fit(X, Y, epochs=100, validation_split=0.33)


该功能也可以通过设置 validation_data 参数,并向其传递 X 和 Y 数据集元组来执行。


  1. ...

  2. history = model.fit(X, Y, epochs=100, validation_data=(valX, valY))


在验证数据集上计算得到的度量指标会使用相同的命名,只是会附加一个「val_」前缀。


  1. ...

  2. model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

  3. history = model.fit(X, Y, epochs=100, validation_split=0.33)

  4. print(history.history['loss'])

  5. print(history.history['acc'])

  6. print(history.history['val_loss'])

  7. print(history.history['val_acc'])


2. 诊断图


LSTM 模型的训练历史可用于诊断模型行为。你可以使用 Matplotlib 库来进行性能的可视化,你可以将训练损失和测试损失都画出来以作比较,如下所示:


  1. from matplotlib import pyplot

  2. ...

  3. history = model.fit(X, Y, epochs=100, validation_data=(valX, valY))

  4. pyplot.plot(history.history['loss'])

  5. pyplot.plot(history.history['val_loss'])

  6. pyplot.title('model train vs validation loss')

  7. pyplot.ylabel('loss')

  8. pyplot.xlabel('epoch')

  9. pyplot.legend(['train', 'validation'], loc='upper right')

  10. pyplot.show()


创建并检查这些图有助于启发你找到新的有可能优化模型性能的配置。


接下来,我们来看一些例子。我们将从损失最小化的角度考虑在训练集和验证集上的建模技巧。


3. 欠拟合实例


欠拟合模型就是在训练集上表现良好而在测试集上性能较差的模型。


这个可以通过以下情况来诊断:训练的损失曲线低于验证的损失曲线,并且验证集中的损失函数表现出了有可能被优化的趋势。


下面是一个人为设计的小的欠拟合 LSTM 模型。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((len(X), 1, 1))

  12. return X, y

  13. # return validation data

  14. def get_val():

  15. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  16. seq = array(seq)

  17. X, y = seq[:, 0], seq[:, 1]

  18. X = X.reshape((len(X), 1, 1))

  19. return X, y

  20. # define model

  21. model = Sequential()

  22. model.add(LSTM(10, input_shape=(1,1)))

  23. model.add(Dense(1, activation='linear'))

  24. # compile model

  25. model.compile(loss='mse', optimizer='adam')

  26. # fit model

  27. X,y = get_train()

  28. valX, valY = get_val()

  29. history = model.fit(X, y, epochs=100, validation_data=(valX, valY), shuffle=False)

  30. # plot train and validation loss

  31. pyplot.plot(history.history['loss'])

  32. pyplot.plot(history.history['val_loss'])

  33. pyplot.title('model train vs validation loss')

  34. pyplot.ylabel('loss')

  35. pyplot.xlabel('epoch')

  36. pyplot.legend(['train', 'validation'], loc='upper right')

  37. pyplot.show()


运行这个实例会产生一个训练损失和验证损失图,该图显示欠拟合模型特点。在这个案例中,模型性能可能随着训练 epoch 的增加而有所改善。



欠拟合模型的诊断图


另外,如果模型在训练集上的性能比验证集上的性能好,并且模型性能曲线已经平稳了,那么这个模型也可能欠拟合。下面就是一个缺乏足够的记忆单元的欠拟合模型的例子。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((5, 1, 1))

  12. return X, y

  13. # return validation data

  14. def get_val():

  15. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  16. seq = array(seq)

  17. X, y = seq[:, 0], seq[:, 1]

  18. X = X.reshape((len(X), 1, 1))

  19. return X, y

  20. # define model

  21. model = Sequential()

  22. model.add(LSTM(1, input_shape=(1,1)))

  23. model.add(Dense(1, activation='linear'))

  24. # compile model

  25. model.compile(loss='mae', optimizer='sgd')

  26. # fit model

  27. X,y = get_train()

  28. valX, valY = get_val()

  29. history = model.fit(X, y, epochs=300, validation_data=(valX, valY), shuffle=False)

  30. # plot train and validation loss

  31. pyplot.plot(history.history['loss'])

  32. pyplot.plot(history.history['val_loss'])

  33. pyplot.title('model train vs validation loss')

  34. pyplot.ylabel('loss')

  35. pyplot.xlabel('epoch')

  36. pyplot.legend(['train', 'validation'], loc='upper right')

  37. pyplot.show()


运行这个实例会展示出一个存储不足的欠拟合模型的特点。


在这个案例中,模型的性能也许会随着模型的容量增加而得到改善,例如隐藏层中记忆单元的数目或者隐藏层的数目增加。



欠拟合模型的状态诊断线图


4. 良好拟合实例


良好拟合的模型就是模型的性能在训练集和验证集上都比较好。


这可以通过训练损失和验证损失都下降并且稳定在同一个点进行诊断。


下面的小例子描述的就是一个良好拟合的 LSTM 模型。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((5, 1, 1))

  12. return X, y

  13. # return validation data

  14. def get_val():

  15. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  16. seq = array(seq)

  17. X, y = seq[:, 0], seq[:, 1]

  18. X = X.reshape((len(X), 1, 1))

  19. return X, y

  20. # define model

  21. model = Sequential()

  22. model.add(LSTM(10, input_shape=(1,1)))

  23. model.add(Dense(1, activation='linear'))

  24. # compile model

  25. model.compile(loss='mse', optimizer='adam')

  26. # fit model

  27. X,y = get_train()

  28. valX, valY = get_val()

  29. history = model.fit(X, y, epochs=800, validation_data=(valX, valY), shuffle=False)

  30. # plot train and validation loss

  31. pyplot.plot(history.history['loss'])

  32. pyplot.plot(history.history['val_loss'])

  33. pyplot.title('model train vs validation loss')

  34. pyplot.ylabel('loss')

  35. pyplot.xlabel('epoch')

  36. pyplot.legend(['train', 'validation'], loc='upper right')

  37. pyplot.show()


运行这个实例可以创建一个线图,图中训练损失和验证损失出现重合。


理想情况下,我们都希望模型尽可能是这样,尽管面对大量数据的挑战,这似乎不太可能。



良好拟合模型的诊断线图


5. 过拟合实例


过拟合模型即在训练集上性能良好且在某一点后持续增长,而在验证集上的性能到达某一点然后开始下降的模型。


这可以通过线图来诊断,图中训练损失持续下降,验证损失下降到拐点开始上升。


下面这个实例就是一个过拟合 LSTM 模型。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((5, 1, 1))

  12. return X, y

  13. # return validation data

  14. def get_val():

  15. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  16. seq = array(seq)

  17. X, y = seq[:, 0], seq[:, 1]

  18. X = X.reshape((len(X), 1, 1))

  19. return X, y

  20. # define model

  21. model = Sequential()

  22. model.add(LSTM(10, input_shape=(1,1)))

  23. model.add(Dense(1, activation='linear'))

  24. # compile model

  25. model.compile(loss='mse', optimizer='adam')

  26. # fit model

  27. X,y = get_train()

  28. valX, valY = get_val()

  29. history = model.fit(X, y, epochs=1200, validation_data=(valX, valY), shuffle=False)

  30. # plot train and validation loss

  31. pyplot.plot(history.history['loss'][500:])

  32. pyplot.plot(history.history['val_loss'][500:])

  33. pyplot.title('model train vs validation loss')

  34. pyplot.ylabel('loss')

  35. pyplot.xlabel('epoch')

  36. pyplot.legend(['train', 'validation'], loc='upper right')

  37. pyplot.show()


运行这个实例会创建一个展示过拟合模型在验证集中出现拐点的曲线图。


这也许是进行太多训练 epoch 的信号。


在这个案例中,模型会在拐点处停止训练。另外,训练样本的数目可能会增加。



过拟合模型的诊断线图


6. 多次运行实例


LSTM 是随机的,这意味着每次运行时都会得到一个不同的诊断图。


多次重复诊断运行很有用(如 5、10、30)。每次运行的训练轨迹和验证轨迹都可以被绘制出来,以更鲁棒的方式记录模型随着时间的行为轨迹。


以下实例多次运行同样的实验,然后绘制每次运行的训练损失和验证损失轨迹。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. from pandas import DataFrame

  7. # return training data

  8. def get_train():

  9. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  10. seq = array(seq)

  11. X, y = seq[:, 0], seq[:, 1]

  12. X = X.reshape((5, 1, 1))

  13. return X, y

  14. # return validation data

  15. def get_val():

  16. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  17. seq = array(seq)

  18. X, y = seq[:, 0], seq[:, 1]

  19. X = X.reshape((len(X), 1, 1))

  20. return X, y

  21. # collect data across multiple repeats

  22. train = DataFrame()

  23. val = DataFrame()

  24. for i in range(5):

  25. # define model

  26. model = Sequential()

  27. model.add(LSTM(10, input_shape=(1,1)))

  28. model.add(Dense(1, activation='linear'))

  29. # compile model

  30. model.compile(loss='mse', optimizer='adam')

  31. X,y = get_train()

  32. valX, valY = get_val()

  33. # fit model

  34. history = model.fit(X, y, epochs=300, validation_data=(valX, valY), shuffle=False)

  35. # story history

  36. train[str(i)] = history.history['loss']

  37. val[str(i)] = history.history['val_loss']

  38. # plot train and validation loss across multiple runs

  39. pyplot.plot(train, color='blue', label='train')

  40. pyplot.plot(val, color='orange', label='validation')

  41. pyplot.title('model train vs validation loss')

  42. pyplot.ylabel('loss')

  43. pyplot.xlabel('epoch')

  44. pyplot.show()


从下图中,我们可以在 5 次运行中看到欠拟合模型的通常趋势,该案例强有力地证明增加训练 epoch 次数的有效性。



模型多次运行的诊断线图


扩展阅读


如果你想更深入地了解这方面的内容,这一部分提供了更丰富的资源。

  • Keras 的历史回调 API(History Callback Keras API,http://ift.tt/2xMgZfE
  • 维基百科中关于机器学习的学习曲线(Learning Curve in Machine Learning on Wikipedia,http://ift.tt/2yiSKcg
  • 维基百科上关于过拟合的描述(Overfitting on Wikipedia,http://ift.tt/2xLVaNt


总结


在本教程中,你学习到如何在序列预测问题上诊断 LSTM 模型是否拟合。


具体而言,你学到了:


  • 如何收集 LSTM 模型的训练历史并为其画图。
  • 如何判别一个欠拟合、良好拟合和过拟合的模型。
  • 如何通过平均多次模型运行来开发更鲁棒的诊断方法。
]]> 原文: http://ift.tt/2yiCSGz
RSS Feed

机器知心

IFTTT

通过Crowd Layer,利用众包标注数据集进行深度学习

本文通过在深度神经网络中引入一种新型众包层(crowd layer),通过反向传播方式,直接利用噪声标签实现端到端的训练。该方法可获取不同标注者的可信度和偏差,并在不同数据集上取得最优结果。



论文链接:http://ift.tt/2x96kd3


摘要:在过去几年中,深度学习显著提高了机器学习各个分支的先进技术水平,给机器学习领域带来了变革。然而,随着监督式人工神经网络的规模不断增大,对大型标注数据集的需求量也越来越大。近期,众包成为以可扩展的方式标注大型数据集的一种高效、廉价的解决方案。但这通常需要整合来自不同专业水平的多个噪声标签贡献者的标签。在这篇论文中,我们针对的就是深度神经网络的众包训练问题。首先,我们将介绍最大期望值算法(EM),这种算法同时学习网络中的参数和不同标注者进行分类设置的混淆矩阵。然后,我们提出了一种新型的通用众包层(crowd layer),这个层可以使深度神经网络用反向传播的方式,直接利用不同标注者的噪声标签进行端到端的训练。我们的实验结果表明使用这种方法可以内部获取不同标注者的可信度和偏差,并在不同设置(如分类、回归和序列标注)的各种众包数据集上得到最优结果。



图 1. 具备 4 个类别和 R 个标注者的分类 CNN 的瓶颈结构



表 1:不同分类数据集的准确率结果:狗 vs. 猫和 LabelMe



图 2. 标注者的真实敏感度(true sensitivity)和真实特异度(true specificity)与狗 vs. 猫数据集中的权重矩阵 w^r 对角线元素的对比。



图 3. 权重矩阵 w^r 和对应的混淆矩阵的对比。



表 2. MovieReviews(MTurk)数据集的训练结果。



图 4. 学得的 b^r 参数和标注者的真实偏差之间的关系。



表 3. CoNLL-2003 NER(MTurk)数据集的训练结果。

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

机器知心

IFTTT

当网络性爱进化到算法时代,付费约会网站每年盈利超过十亿美元

编译 | 王宇欣 藤子

来源 | wired


难以估量,互联网对世界的影响之深远。


它不仅点燃了一场信息的革命之火,使个人、团体、政府与上亿人的沟通成为了可能。然而,在互联网的萌芽阶段,就有少数人预言道,互联网将成为人类建造的最大的手淫机器。


人们会在网络上浏览性爱的内容,也会在夜深人静之时,匿名搜索一些跟禁忌之恋有关的内容,这些人隐藏之深,连他们的网络地址都很难找到。还有一些人会「披上别人的马甲」,改头换面,构建另一个身份。


J. C. Herz 是一位科技领域的作家,她在 1995 年出版的 Surging on the Internet 一书中指出,广袤无垠的互联网给人们提供了现实中并不存在的性别选项,比如,虚拟世界黏巴达社区(LambdaMOO)为用户提供了 6 种不同的性别选择,分别为:男性、女性、中性、无性别、皇室(旧时国王或女王的自称)和 natty,对 『splat』无所谓的人。在那里,女人和男人会互相调换身份,还会与不同性别的网络伙伴进行虚拟性爱。这种弹性规则让人们拥有了幻想和角色扮演的自由。


随着数字化时代的爆炸,多样的性爱大行其道。


在 80 年代后期和 90 年代早期,网络性爱有其隐含意义:虚拟与现实的纽带。从理论上来说,虚拟现实性爱,是人们穿上特殊的服装/虚拟手套/带着花彩头饰,远程诱惑其性伴侣,进行模拟性爱,有时候也伴有视听特效。


计算机生成图像技术 (CGI) 在 1990 年是电影制作方面的一个巨大突破,网络性爱则是对 stim 的 模仿。有一段时间,它有一个尴尬的名字「远程电动性玩具(teledildonics)」。在那时,Cybersex 完全只是一个噱头罢了。1997 年,Mike Myers 拍了一部类似芭芭丽娜(Barbarella)、普特尼·斯沃普(Putney Swope)、睡美人(Sleeper)和液态的天空(Liquid Sky)的电影,探索机器人性爱理论,在他的摇滚六十年代(Swinging Sixties)中恶搞了王牌大贱谍(Austin Powers:International Man of Mystery)。但是现在我们都可以通过试管培养婴儿,为什么不让极客们从半人马星带回他的家具呢?


从那之后,teledildonics 才被称为 cybersex/虚拟性爱/网络性爱。这些词汇大多来自有思网(Usenet)和新闻组(newsgroups)。在一个名为 MUDS 的幻想论坛,它有时也被称为 TinySex,Sherry Turkle 在其 1995 年出版的 *Life on the Screen: Identity in the Age of the Internet,就描述了早期的这种「以计算机为媒介以性爱为目的的交流」。


随着光盘和影碟的兴起(交互式软盘可被分为磁盘驱动型或游戏机控制型),用户可以在性娱乐游戏中下达简答的命令并选择不同的方案或结局。网上也有供用户上传性爱故事的论坛(也可以添加其他的故事),而且很多故事都是连载的,这吸引了大批读者。还有一些刚刚兴起的网站会盗取印刷的色情图片,然后作为自己的图片上传到网上;有虚拟的脱衣二十一点网站;还有一些网站的网络模特会从纸盒大小的洞里弹出来,她们会对一些键盘指令作出反应,比如对「把那些渔网袜脱了怎么样?」这种指令的反馈。互联网开始迎合各种形式的性爱活动。


据福布斯报道,截止 90 年代末期,一共有五十万个性爱网站存在,平均每周会出现 100 个新的网站,这些网站通过广告、产品以及在网站上贴出其他更具诱惑性网站的链接而获得不菲的收入。到 2000 年,色情产业仅在互联网商业方面的收入每年就可达到二十亿美元。


这些网站提供虚拟色情服务。大多数都用来手淫(autoerotic)。这种单独的互联网性爱,大多数人都对其持暧昧的态度,认为有更少的情感纠葛并且很少带来麻烦。一个人能够如此高效的满足自己,那为什么要对别人的需求横加阻碍呢?对于很多网络用户来说,这种人为的产物确实可以代替现实:网络性爱没有达成相互间的联系,它是一种自我的释放。但是网络性爱带来的并非只有这些。


对于数百万其他人来说,最初的网络性爱(cybersex)为他们带来了真正的婚礼,让他们之间更加亲近。两个陌生人之间互相交流,通过在键盘上打字来模拟成伴侣,可以在一个全新的平台上体验实时互动。互联网性爱促进了自我价值。它为被理论限制的伴侣提供了多样性。它的虚拟特性使「虚拟背叛(online cheating)」更能被一个人的真实生活中伴侣或自身的良知所接受。其附属的匿名功能更是让人兴奋,也更让人容易摆脱日常的约束。


而对于许多用户来说,因为匿名带来的安全性战胜了真实的体验,毕竟通过电子通信沟通不可能染上性病。


骗子


最早的关于互联网性爱的可怕的故事发生在The WELL 社区。Susie Bright 是西海岸性女权解放运动的领袖,在 1990 年代早期从On Our Backs 的编辑职位离职。她第一次上网是因为在计算机公告板上听过了名为*The WELL 的社区上的人们参加了网络上「我为什么喜欢 Susie Bright 的讨论。


在通过一系列采访的和电子邮件,The WELL 就像一个闪闪发光的崭新的玩具吸引着每一个媒体人,也包括 Bright。在这个社区上,有一个只有女性能加入的私人讨论组。


「在 The WELL 上确实有很多女性,对于一个互联网小组来说,这是一个很惊人的数字。这也是 The WELL 这么酷的原因之一。」Bright 说,「但是我一直都没参与过这种小组,计算机被认为是一个男性的领域。这个私人的女性讨论组—很爱讨论一些八卦以及我们的私人生活,这些东西我们绝对不希望在公众场合被别人知道—一些人则开启了一个话题 『That Son-of-a-Bitch。』


「听起来挺厉害的,是吧?」她笑道。


「这个女人讲了故事,说她是怎样在 The WELL 上遇见这个美妙的男人的,这个故事深深地触动了我,他们就像是天生的一对。但在这个故事结尾,就像你想象的那样,男人露出了獠牙,他是一个骗子。他看起来是那么真诚,对她也很感兴趣,说着『我们要去约会了』之类的话,然后他就有了一些紧急情况需要她寄些钱过去。这就是一切转折的地方。但是那时候,她深爱着他,沉醉在他们那些美好的愿景中:他们会有一场电话性爱;他们还能在网上做很多事。所以当他开始向她要钱的时候,她甚至都没有意识到一切的到来。」Bright 回忆在社区上发生的事情。


Bright 记得另一个 WELL 参与者插嘴说的话。「那个女人打断了我然后说,『我身上也发生了同样的事情,我没有告诉任何人,这件事太让人尴尬了,而且也难以启齿,我感觉我就像一个傻子。所以这样的事情才会发生在我们身上吧,我们都属于过于自作聪明的人,计算机天才女性,这件事情怎么会发生在我们身上呢?』她们相互比较了一下,这是同一个男人。」当她们把这个男人的名字公布在 The WELL 更大的社区上时,Bright 回忆说,「这件事让人们群情激奋。她们揭发了他。这个男人对很多其他的年轻女性也做了一样的事情,这太恐怖了。」


Bright 回忆了当时她的反应:「我就那么坐在我的键盘前面,狠狠地把咖啡摔了出去,我几周前才和这个男人在纽约做过爱。在现实中。我实在是太尴尬了,不像其他人,我没有给他钱。我和他做爱了。我没有那么疯狂地爱上他。我当时在进行小说的巡展。和他离得很近。是的,他就是一个狂热的粉丝,他告诉我他有多么想要和我见面,得知我要来纽约的时候他愿意为我做一切事情。然后我说,『好吧,那我们来见一面吧。』他在新泽西。这个男人身后有那么多为他疯狂的女人。据我所知,他是我遇到的第一个网络混蛋。」


更多的自由


互联网有消极的一面,自然就会有积极的一面。我朋友 Stephen Mayes 是一位受人尊敬的图像编辑师,他坚决认为互联网对很多男性同性恋的性生活和伴侣们有着巨大的积极影响。「在酒吧我从未与任何一个男性搭讪,这让我非常难过,」在曼哈顿东村的一家地下酒吧里,Mayes 喝醉后说出了实情。「互联网让我重新认识了自己。之前在那些同性恋酒吧中总是会有一群法西斯极权主义的家伙:一般都是满身肌肉,肩膀带着那些东西的。我不是那种肌肉男。所以在酒吧,我总是很怕,很怕被拒绝。随着互联网的出现,我深深地坠入了那个世界,我相信有人会接受我的。互联网释放了我的所有恐惧。它给我以自由,让我可以和男人约谈,我之前从未有过这种体验。」


也许有人认为,对于男性同性恋们的刻板的性审美,数字化时代能做的很多。他坚决认为,「同志世界似乎非常适合这种共享的理念。」「这是一个开放的世界,就像是网络一样。它有自己的优点:开放的关系,共享的伴侣等等。过去,我们总是要偷偷摸摸地在地下互动,但是一旦脱离了社会的约束,我们就能拥有自己的自由。」


在许多方面来说,早期的数字化领域有自己的特征:隐私性,特定成员性社会(有自己的语言、规范和自由的风气,不为外人所知)。


Mayes 回忆道,在同一时间,1990 年代展开的数字摄影的革命对一些醉心于可视化性信息的人来说,无疑是个好消息。这些人沉溺于交换私人照片以及观看诱惑性的家庭性爱所带来的愉悦之中。他说,十年前,许多男性同性恋都对宝丽来一次成像(Polaroids)情有独钟(无需处理即可出片),他们担心将交卷带到街角的杂货店或是那种需要等一个小时才能出片的照相馆会给自己惹上麻烦。Mayes 说,「这是一种社会的耻辱,并且更重要的是,把胶卷带到冲洗处所引发的法律问题。在 2000 年以前,鸡奸在很多地方都是违法的,比如德克萨斯州。所以数字摄像机解放了人们。」


这些有关隐私的数字化照片可以很容易地进行电子交易。Mayes 提醒道,在互联网的早期,「数字化性图片是非常私人的,你持有这些图片,把它们放在你的私人计算机中,与其它人进行分享。没有这样的技术!在 90 年代后期,这一切都变了。如果你想,你就能将张片放在网上吸引伴侣,你也觉得这是隐私。你需要在后台注册姓名。实际上,你正在向和你一样的人打招呼。但是这里存在一个误解,你以为你在向一个非常私密的俱乐部提供信息。事实上,任何人都可以登记,此外,你可以下载照片,然后突然你自己照片就会在网上疯狂的传播。这就是这些网站给我们带来的好处,同性恋和异性恋或者别的,我们根本没想到,我们个人的照片会成为公开展览品,并且随时可能失去控制。」


网络约会


对于很多人来说,互联网就像是一个虚拟的单身酒吧。在这个最大的约会场所,化学(两性之间的火花)也会被代数所代替。被设计出的算法通过包含会员喜好的庞大的属性数据库进行区分和并按照潜在伴侣的成功率和关系的长久度进行排名。个人用户会与其可能约会对象一起被列在一个名单中,缘分到来的时候,也许就能成为一对。


当然,配对服务已经存在了几十年了。但是互联网使这种人工诱导的互动变得更加体面。逐渐地,新的模式开始变得越来越好。在数字化的时代,单身人士,不论年纪,都开始接受网络约会,人们对网络约会的认可度逐渐提升,认可其安全性及高效性。事实上,算法和筛选过程赋予了其权威性。(在当时,专栏记者 Michael Wolff 将网络约会形容为一种全新的、非同寻常的求偶方式:「一种完美的,体面的,不起眼的事情。」)通过对比较,单身场所、酒吧实在是太愚蠢了。


约会网站正在兴起。这种 90 年代出现的现象彻底革新了如今城市居民结合、定居的方式,据纽约客 Nick Paumgarten 报道,「付费约会网站」每年盈利超过十亿美元并且已经成为「第三种最常见的约会方式。(前两者是『通过工作/学校』和『通过朋友/家庭』)。


随着交友网络公司的增长,这些网络约会场所已经转型为更广泛的联系场所。这些是初创公司的社会网络,从文化的广泛性来讲,他们比交友网站更具影响力。


社会媒体不仅有助于鉴定个人的个性和性表现力(在潜在的追求者、朋友、陌生人甚至是可能的老板眼中塑造一个人在真实世界中的声誉和网络态度),还对社会互动、言论自由和政治变革等有长期的影响。像 TheGlobe.com 和 SixDegrees.com 等服务(在 Friendster、LinkedIn、MySpace、Facebook 之前)是大量用户聚集交流、交换分享兴趣、爱好或背景等信息的网络中心。


当然,性在社会媒体的起源中一直处于中心位置。「我们经常会忘记之前在社交网络上到处都是关于性的条条框框,」我朋友,摄影制片人 Rachel Winter 说。「Facebook 建立了一种为女性外貌打分的方法。从那个起初为了女同学而构建的网络一直到之后的一切,包括所有的起伏。在这个舞台上,我会说:让我们松口气,禁用社交媒体 5 年的时间。我们都会变得更好。」


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

机器知心

IFTTT

拒绝朋友圈旅行,这10本数据科学必读书才是「打开假期的正确方式」

编译 | 邱陆陆

来源 | BRIDGEi2i


打开假期的正确方式是什么?出去玩,到处人山人海「堵得你没商量」,看朋友圈旅行,总是不过瘾。那不如窝在家里,「静静地」看完这10本 BRIDGEi2i 基于亚马逊和 Goodreads 社区中的读者评论和点赞,评选出的畅销数据科学必读书。

这些书不只告诉你这个行业的运作方式,还能帮助你高效地做好日常工作。不只向你解释数据科学的点滴,也不止步于告诉你如何进行分析,而是教给你,讲故事的艺术。


不管你是新手还是老手,这些书都会让你成为一位更优秀的分析领域专业人士,读完腰不不酸腿不疼升职加薪到「没朋友」。



Data Analytics Made Accessible,Anil Maheshwari 著


面向对象:几乎不知道什么是数据科学的新手或实习生


关于作者:Anil Maheshwari 在管理实践领域拥有超过 20 年的经验,包括业务开发、市场营销、全球品牌、社交媒体、项目管理、IT 咨询和培训。


推荐理由:这本书带你过了一遍数据分析的所有主要的话题和考量。书中有问题、例子和练习题可以帮助你深入地了解每一个主题。这本书很易读,内容也很丰富。它用具体的例子讨论了所有重要的内容,并吸引读者加入数据分析领域。


读者感想:这里有您想了解的关于商业智能和数据挖掘的一切。有大量你应该背下来的要点列表。



Storytelling with Data: A Data Visualization Guide for Business Professionals,Cole Nussbaumer Knaflic 著


面向对象:想要像设计师一样思考的数据可视化专家


关于作者:Cole Nussbaumer Knaflic 能将数据变成艺术品。她是一位广受欢迎的博主。她的研讨会和演讲都受到世界范围内数据领域的专业人士、公司以及慈善组织的好评。


推荐理由:如果你正在试图创造或者设计你的数据 dashboard,那么你绝对应该好好读读这本书。本书告诉你如何讲述数据背后的故事。通过这本书,你将发现讲故事的力量,以及如何让数据成为 dashboard 设计中的关键元素。在每一章中,作者简要地讨论一个商业场景,然后将 dashboard 分解成组件,分析哪些工作很有效,哪些可以做改进。这本书展示了如何超越传统的工具,使用你的数据来创造一个引人入胜、信息丰富、引人注目的设计。


读者感想:让自己的所有观点圆融自洽不是一件容易事。Cole Nussbaumer Knaflic 在她的第一本书中就实现了这一点。她提倡清晰和简明,而她的书就是清晰、简洁、实用的。如果你是一个初学者,或者你在日常工作中需要用 Excel、Tableau、Qlik 等工具制作图表,这是一个开始学习核心原则的好地方。  ——Alberto Cairo,迈阿密大学的可视化教授,The Functional Art 一书的作者



Too Big to Ignore: The Business Case for Big Data by award-winning,P. Simon 著


面向对象:非数据分析领域的专业人士,但是想要将数据分析应用到自己的业务中


关于作者:Phil Simon 有丰富地把全是术语的技术信息和专业知识转化为简单平实的语言的经验。他曾经是 EA,Cisco,Zappos 和 Netflix 等公司的发言人。


推荐理由:这本书告诉你为什么大数据是企业的灵丹妙药。作者向想要了解大数据技术的好处的管理团队和组织给出了很多平实的建议。这本书里有很多世界各地的大数据专家如何解决问题的例子、案例研究和观点引用。对于 CEO、企业主和行业领导者来说,这本书都很值得读。这本书可以为您的组织提供将数据转化为智能,将智能转化为行动计划所需的驱动力。


读者感想:越来越多的企业家、投资者和客户谈论大数据,但我们反而越来越难以理解这个短语的含义。Phil Simon 为大数据做出了很好的定义,并为那些通常被归为「大数据」类别的想法给出了明确的商业案例。  ——Foundry Group 的 管理总监 Brad Feld



Performance Marketing with Google Analytics,由 Sebastian Tonkin,Caleb Whitmore 和 Justin Cutroni 合著


面向对象:希望通过分析来提升营销绩效并改善品牌美誉度的 CMO


关于作者:Sebastian Tonkin 是一名企业家,是 Google Analytics 团队的前成员。Caleb Whitmore 是 Google Analytics 顾问和 Analytics Pros 的创始人。Analytics Pros 致力于帮助用户更好地使用 Google Analytics。Justin Cutroni 是 Google Analytics 研讨会组织者,热门博客 Google Analytics Talk 的作者,也是一位帮助公司了解如何从 Google Analytics 获得最大价值的分析师。


推荐理由:作者全面地阐释了如何通过 Google Analytics 实现你的数字营销目标。他们从与绩效营销策略的相关概念解释开始,逐渐给出更精确的分步分析以及应用实例。你会在书中找到谈论如何通过搜索广告增加收入、如何优化现有网站、如何改善渠道和促销活动、如何强化品牌美誉度等等话题的章节。本书还介绍了 Google 的众多工具,包括 AdWords、AdSense、Google Trends 等。


读者感想:它让我明白如何最大限度地进行基于 Google Analytics 的整体营销。它不是简单地如何使用 Google Analytics,它讨论的是如何在 Google Analytics 时代做营销。书里有非常多使用的建议和例子。



You Should Test That,Chris Goward 著


面向对象:寻求潜在客户、转化优化、收入优化的战略家


关于作者:Chris Goward 是 WiderFunnel 的创始人兼首席执行官。他被公认为是转化优化思想的领军人物,他拥有一个极具影响力的博客。


推荐理由:Chris Goward 解释了转化优化策略的「为什么」和「怎么做」。本书将帮助您制定销售或营销优化策略,以适当的分析工具支持您的业务目标。这本书还会用练习、案例和全彩的关键策略点强调来你如何执行。


读者感想:这本书提供了一个易于理解的框架,并提供了许多关于如何针对特定目标进行优化的优秀构想。这是一个有广泛需求的全面的测试方法。  ——Jesse Nichols,Google Analytics 成员



Ten Signs of Data Science Maturity,由 Peter Guerra 与 Kirk Borne 合著


面向对象:希望在数据科学和大数据分析方面建立更强竞争力的数据科学和分析领导者


关于作者:Kirk Borne 博士是 Booz Allen Hamilton 的首席数据科学家,他曾任 George Mason 大学的教授,负责计算科学与信息学课程。他还在 NASA 工作了 18 年,担任过哈勃望远镜 Data Archive Project 的科学家。Peter Guerra 是 Booz Allen Hamilton 的战略创新团队的副总裁。他的专长是建设高可用性、大规模分布式系统,他领导过很多高级分析和大型数据计算项目。


推荐理由:您的组织有多希望使用数据科学?您如何识别您的组织是否具有成熟的数据处理能力?您如何帮助您的分析团队磨练其技能?如果您是数据科学领导者,正在寻找这些问题的答案,那么您应该好好读读这本书。这本书给出了一份详细的报告,讨论了数据科学成熟度的十个衡量标准。它鼓励分析专业人员让组织中的每个人都能够访问所有可用数据,使用 DataOps 做数据产品开发,帮助您的数据科学团队通过外部或内部竞争来提高其技能。本书把数据科学视为一种做事方式,而不是一件要做的事情。


读者感想:任何想要建立数据科学能力的数据科学领导者都应该阅读本书,并在组织内部引导一种成熟的分析文化。



Thinking Fast and Slow,Daniel Kahneman 著


面向对象:想要理解有关人们是如何做决策的相关概念的企业领导者


关于作者:Daniel Kahneman 是普林斯顿大学心理学教授。他与 Amos Tversky 在决策制定方面进行的开创性工作让他获得了 2002 年诺贝尔经济学奖。


推荐理由:Kahneman 解释了脑中两个「系统」如何做出决定。「系统 1」是大脑中快的、直觉的部分。「系统 2」是大脑中慢的、合乎逻辑和推理的部分。他以举例的方式,生动形象地说明了,为什么我们经常作出不合理的决策。他对于我们如何在工作和生活中作出决策给出了具有启发性的阐述,并且指导我们如何用不同的技巧来避免那些经常让我们陷入困境的「理智出走」。


读者感想:任何对人类行为或者投资感兴趣的人都应该读读这本书。他清楚地说明,虽然我们总觉得自己在决策时是理性的,但事实是我们经常受困于偏见。这本书给你一个更好地机会去学习如何规避,起码是减少偏见。 ——来自 CBS News 的 Larry Swedroe



Weapons of Math Destruction,Cathy O'Neil 著


面向对象:想要了解大数据驱动的数学模型的「月亮背面」的数据科学家和组织决策者


关于作者:Catherine Helen O'Neil 是一位美国数学家,博客作者、畅销书作者,著有几本数据科学书籍。她曾担任哥伦比亚大学新闻学院数据实践项目主任,她还曾在 Johnson Research Labs 做数据科学顾问。


推荐理由:作者通过现实世界的例子和活泼的讲述方式,展示了所谓大数据算法和数学模型是如何反过来控制人的。书中所使用的案例研究非常引人入胜且简明扼要。这本书能够让数据科学家明白那些实际上「控制」了企业决策 隐形算法。


读者感想:思路清晰、引人深思。任何会被大数据影响的人都应该读读这本书,也就是说,任何人都应该读读这本书。



Infonomics: How to Monetize, Manage and Measure Information as an Asset for Competitive Advantage,Douglas B.Laney 著


面向对象:首席数据官,以及打算在数字化经济时代取得成功的商业领袖


关于作者:Doug Laney 是 Gartner 的首席数据官(CDO)和杰出分析师。他是一名经验丰富的从业者,两度获得 Gartner 年度思想领袖奖。


推荐理由:信息量化是讲述量化信息资产价值的方法和策略的学科,它也研究如何将信息用作提升竞争力、推动增长的武器。该书为如何评估信息价值提供了有用的框架,并指出了公司在最大化信息价值的过程中面临的挑战。Doug 以亲身经历举例,说明了 CDO 在制定数据策略时应该考虑哪些问题。


读者感想:这本书为一个全新的学科的发展奠定了基础。大多数商业领袖似乎都忽略了信息的无限可重复性和可重用性。它的低存储和传输成本以及高度可自动化性质让它成为无与伦比的资源。本书为信息评估提供了有用的框架,明确了企业在试图最大限度发挥信息价值时所面临的众多挑战,以及应对这些挑战、并在新兴经济中蓬勃发展的方法。  ——新南威尔士政府首席数据科学家 Ian Oppermann



Flash Boys: A Wall Street Revolt,Michael Lewis 著


面向对象:想要全方位了解金融危机和高频交易的金融行业人士


关于作者:Michael Lewis 曾出版过多本畅销书。他最近的作品 Moneyball、The Big Short 和 Boomerang,都在讲述全球金融危机的故事。他是 Bloomberg 的专栏作家,也是 Vanity Fair 的特约撰稿人。


推荐理由:本书描绘了高频交易繁荣的表象以及连腐化都极为复杂的内里。Michael 以他独特的叙述风格,深入地解释了股票市场的运行机制。这本书讲述了一个动人的故事,有许多引人入胜的人物。尽管这个主题很复杂,但大多数概念解释得很清晰。这本书也很好地解释了当前的行业氛围及其对市场的潜在危害。


读者感想:特别迷人……描述了华尔街如何在背地里完成大部分交易的过程。


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

机器知心

IFTTT

JavaScript 之父联手近万名开发者集体讨伐 Oracle:给 JavaScript 一条活路吧!- InfoQ 每周精要848期

「每周精要」 NO. 848 2024/09/21 头条 HEADLINE JavaScript 之父联手近万名开发者集体讨伐 Oracle:给 JavaScript 一条活路吧! 精选 SELECTED C++ 发布革命性提案 "借鉴"Rust...