Next Page: 10000

          赛尔译文 | Transformer注解及PyTorch实现(上)      Cache   Translate Page      

原文:http://nlp.seas.harvard.edu/2018/04/03/attention.html

作者:Alexander Rush

译者:哈工大SCIR 赵正宇

转载需注明出处:哈工大SCIR


赛尔译文 | Transformer注解及PyTorch实现(上)
"Attention is All You Need"[1] 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,还为许多NLP任务提供了新的结构。虽然原文写得很清楚,但实际上大家普遍反映很难正确地实现。

所以我们为此文章写了篇注解文档,并给出了一行行实现的Transformer的代码。本文档删除了原文的一些章节并进行了重新排序,并在整个文章中加入了相应的注解。此外,本文档以Jupyter notebook的形式完成,本身就是直接可以运行的代码实现,总共有400行库代码,在4个GPU上每秒可以处理27,000个tokens。

想要运行此工作,首先需要安装PyTorch[2]。这篇文档完整的notebook文件及依赖可在github[3] 或 Google Colab[4]上找到。 需要注意的是,此注解文档和代码仅作为研究人员和开发者的入门版教程。这里提供的代码主要依赖OpenNMT[5]实现,想了解更多关于此模型的其他实现版本可以查看Tensor2Tensor[6] (tensorflow版本) 和 Sockeye[7](mxnet版本) Alexander Rush (@harvardnlp[8] or srush@seas.harvard.edu) 准备工作 # !pip install http://download.pytorch.org/whl/cu80/torch-0.3.0.post4-cp36-cp36m-linux_x86_64.whl numpy matplotlib spacy torchtext seaborn import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import math, copy, time from torch.autograd import Variable import matplotlib.pyplot as plt import seaborn seaborn.set_context(context="talk") %matplotlib inline

内容目录

准备工作

背景

模型结构

- Encoder和Decoder

- Encoder

- Decoder

- Attention

- Attention在模型中的应用

- Position-wise前馈网络

- Embedding和Softmax

- 位置编码

- 完整模型

(由于原文篇幅过长,其余部分在下篇)

训练

- 批和掩码

- 训练循环

- 训练数据和批处理

- 硬件和训练进度

-优化器

-正则化

- 标签平滑

第一个例子

- 数据生成

- 损失计算

- 贪心解码

真实示例

- 数据加载

- 迭代器

- 多GPU训练

- 训练系统附加组件:BPE,搜索,平均

结果

- 注意力可视化

结论

本文注解部分都是以引用的形式给出的,主要内容都是来自原文。

背景

减少序列处理任务的计算量是一个很重要的问题,也是Extended Neural GPU、ByteNet和ConvS2S等网络的动机。上面提到的这些网络都以CNN为基础,并行计算所有输入和输出位置的隐藏表示。 在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数随位置间的距离增长而增长,比如ConvS2S呈线性增长,ByteNet呈现以对数形式增长,这会使学习较远距离的两个位置之间的依赖关系变得更加困难。而在Transformer中,操作次数则被减少到了常数级别。

Self-attention有时候也被称为Intra-attention,是在单个句子不同位置上做的Attention,并得到序列的一个表示。它能够很好地应用到很多任务中,包括阅读理解、摘要、文本蕴涵,以及独立于任务的句子表示。端到端的网络一般都是基于循环注意力机制而不是序列对齐循环,并且已经有证据表明在简单语言问答和语言建模任务上表现很好。

据我们所知,Transformer是第一个完全依靠Self-attention而不使用序列对齐的RNN或卷积的方式来计算输入输出表示的转换模型。

模型结构 目前大部分比较热门的神经序列转换模型都有Encoder-Decoder结构[9]。Encoder将输入序列
赛尔译文 | Transformer注解及PyTorch实现(上)
映射到一个连续表示序列
赛尔译文 | Transformer注解及PyTorch实现(上)
。对于编码得到的,Decoder每次解码生成一个符号,直到生成完整的输出序列:
赛尔译文 | Transformer注解及PyTorch实现(上)
。对于每一步解码,模型都是自回归的[10],即在生成下一个符号时将先前生成的符号作为附加输入。 class EncoderDecoder(nn.Module): """ A standard Encoder-Decoder architecture. Base for this and many other models. """ def __init__(self, encoder, decoder, src_embed, tgt_embed, generator): super(EncoderDecoder, self).__init__() self.encoder = encoder self.decoder = decoder self.src_embed = src_embed self.tgt_embed = tgt_embed self.generator = generator def forward(self, src, tgt, src_mask, tgt_mask): "Take in and process masked src and target sequences." return self.decode(self.encode(src, src_mask), src_mask, tgt, tgt_mask) def encode(self, src, src_mask): return self.encoder(self.src_embed(src), src_mask) def decode(self, memory, src_mask, tgt, tgt_mask): return self.decoder(self.tgt_embed(tgt), memory, src_mask, tgt_mask) class Generator(nn.Module): "Define standard linear + softmax generation step." def __init__(self, d_model, vocab): super(Generator, self).__init__() self.proj = nn.Linear(d_model, vocab) def forward(self, x): return F.log_softmax(self.proj(x), dim=-1)

Transformer的整体结构如下图所示,在Encoder和Decoder中都使用了Self-attention, Point-wise和全连接层。Encoder和decoder的大致结构分别如下图的左半部分和右半部分所示。


赛尔译文 | Transformer注解及PyTorch实现(上)
Encoder和Decoder Encoder

Encoder由N=6个相同的层组成。

def clones(module, N): "Produce N identical layers." return nn.ModuleList([copy.deepcopy(module) for _ in range(N)]) class Encoder(nn.Module): "Core encoder is a stack of N layers" def __init__(self, layer, N): super(Encoder, self).__init__() self.layers = clones(layer, N) self.norm = LayerNorm(layer.size) def forward(self, x, mask): "Pass the input (and mask) through each layer in turn." for layer in self.layers: x = layer(x, mask) return self.norm(x) 我们在每两个子层之间都使用了残差连接(Residual Connection) [11]和归一化 [12]。 class LayerNorm(nn.Module): "Construct a layernorm module (See citation for details)." def __init__(self, features, eps=1e-6): super(LayerNorm, self).__init__() self.a_2 = nn.Parameter(torch.ones(features)) self.b_2 = nn.Parameter(torch.zeros(features)) self.eps = eps def forward(self, x): mean = x.mean(-1, keepdim=True) std = x.std(-1, keepdim=True) return self.a_2 * (x - mean) / (std + self.eps) + self.b_2 也就是说,每个子层的输出为
赛尔译文 | Transformer注解及PyTorch实现(上)
,其中
赛尔译文 | Transformer注解及PyTorch实现(上)
是由子层自动实现的函数。我们在每个子层的输出上使用Dropout,然后将其添加到下一子层的输入并进行归一化。 为了能方便地使用这些残差连接,模型中所有的子层和Embedding层的输出都设定成了相同的维度,即
赛尔译文 | Transformer注解及PyTorch实现(上)

class SublayerConnection(nn.Module):

"""

A residual connection followed by a layer norm.

Note for code simplicity the norm is first as opposed to last.

"""

def __init__(self, size, dropout):

super(SublayerConnection, self).__init__()

self.norm = LayerNorm(size)

self.dropout = nn.Dropout(dropout)

def forward(self, x, sublayer):

"Apply residual connection to any sublayer with the same size."

return x + self.dropout(sublayer(self.norm(x)))

每层都有两个子层组成。第一个子层实现了“多头”的Self-attention,第二个子层则是一个简单的Position-wise的全连接前馈网络。

class EncoderLayer(nn.Module): "Encoder is made up of self-attn and feed forward (defined below)" def __init__(self, size, self_attn, feed_forward, dropout): super(EncoderLayer, self).__init__() self.self_attn = self_attn self.feed_forward = feed_forward self.sublayer = clones(SublayerConnection(size, dropout), 2) self.size = size def forward(self, x, mask): "Follow Figure 1 (left) for connections." x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, mask)) return self.sublayer[1](x, self.feed_forward) Decoder

Decoder也是由N=6个相同层组成。

class Decoder(nn.Module): "Generic N layer decoder with masking." def __init__(self,
          ‘How do neural nets learn?’ A step by step explanation using the H2O Deep Learning algorithm.      Cache   Translate Page      
In my last blogpost about Random Forests I introduced the codecentric.ai Bootcamp. The next part I published was about Neural Networks and Deep Learning. Every video of our bootcamp will have example code and tasks to promote hands-on learning. While the practical parts of the bootcamp will be using Python, below you will find the English R version of this Neural Nets Practical Example, where I explain how neural nets learn and how the concepts and techniques translate to training neural nets in R with the H2O Deep Learning function. You can find the video on YouTube but as, as before, it is only available in German. Same goes for the slides, which are also currently German only. See the end of this article for the embedded video and slides. Neural Nets and Deep Learning Just like Random Forests, neural nets are a method for machine learning and can be used for supervised, unsupervised and reinforcement learning. The idea behind neural nets has already been developed back in the 1940s as a way to mimic how our human brain learns. That’s way neural nets in machine learning are also called ANNs (Artificial Neural Networks). When we say Deep Learning, we talk about big and complex neural nets, which are able to solve complex tasks, like image or language understanding. Deep Learning has gained traction and success particularly with the recent developments in GPUs and TPUs (Tensor Processing Units), the increase in computing power and data in general, as well as the development of easy-to-use frameworks, like Keras and TensorFlow. We find Deep Learning in our everyday lives, e.g. in voice recognition, computer vision, recommender systems, reinforcement learning and many more. The easiest type of ANN has only node (also called neuron) and is called perceptron. Incoming data flows into this neuron, where a result is calculated, e.g. by summing up all incoming data. Each of the incoming data points is multiplied with a weight; weights can basically be any number and are used to modify the results that are calculated by a neuron: if we change the weight, the result will change also. Optionally, we can add a so called bias to the data points to modify the results even further. But how do neural nets learn? Below, I will show with an example that uses common techniques and principles. Libraries First, we will load all the packages we need: tidyverse for data wrangling and plotting readr for reading in a csv h2o for Deep Learning (h2o.init initializes the cluster) library(tidyverse) library(readr) library(h2o) h2o.init(nthreads = -1) ## Connection successful! ## ## R is connected to the H2O cluster: ## H2O cluster uptime: 3 hours 46 minutes ## H2O cluster timezone: Europe/Berlin ## H2O data parsing timezone: UTC ## H2O cluster version: 3.20.0.8 ## H2O cluster version age: 1 month and 16 days ## H2O cluster name: H2O_started_from_R_shiringlander_jpa775 ## H2O cluster total nodes: 1 ## H2O cluster total memory: 3.16 GB ## H2O cluster total cores: 8 ## H2O cluster allowed cores: 8 ## H2O cluster healthy: TRUE ## H2O Connection ip: localhost ## H2O Connection port: 54321 ## H2O Connection proxy: NA ## H2O Internal Security: FALSE ## H2O API Extensions: XGBoost, Algos, AutoML, Core V3, Core V4 ## R Version: R version 3.5.1 (2018-07-02) Data The dataset used in this example is a customer churn dataset from Kaggle. Each row represents a customer, each column contains customer’s attributes We will load the data from a csv file: telco_data % select_if(is.numeric) %__% gather() %__% ggplot(aes(x = value)) + facet_wrap(~ key, scales = "free", ncol = 4) + geom_density() ## Warning: Removed 11 rows containing non-finite values (stat_density). … and barcharts for categorical variables. telco_data %__% select_if(is.character) %__% select(-customerID) %__% gather() %__% ggplot(aes(x = value)) + facet_wrap(~ key, scales = "free", ncol = 3) + geom_bar() Before we can work with h2o, we need to convert our data into an h2o frame object. Note, that I am also converting character columns to categorical columns, otherwise h2o will ignore them. Moreover, we will need our response variable to be in categorical format in order to perform classification on this data. hf % mutate_if(is.character, as.factor) %__% as.h2o Next, I’ll create a vector of the feature names I want to use for modeling (I am leaving out the customer ID because it doesn’t add useful information about customer churn). hf_X
          Scalable Distributed DNN Training using TensorFlow and CUDA-Aware MPI: Characterization, Designs, and Performance Evaluation      Cache   Translate Page      
TensorFlow has been the most widely adopted Machine/Deep Learning framework. However, little exists in the literature that provides a thorough understanding of the capabilities which TensorFlow offers for the distributed training of large ML/DL models that need computation and communication at scale. Most commonly used distributed training approaches for TF can be categorized as follows: […]
          tfds-nightly 0.0.1.dev20181106      Cache   Translate Page      
tensorflow/datasets is a library of datasets ready to use with TensorFlow.
          Python 数据科学入门      Cache   Translate Page      

不需要昂贵的工具即可领略数据科学的力量,从这些开源工具起步即可。

无论你是一个具有数学或计算机科学背景的资深数据科学爱好者,还是一个其它领域的专家,数据科学提供的可能性都在你力所能及的范围内,而且你不需要昂贵的,高度专业化的企业级软件。本文中讨论的开源工具就是你入门时所需的全部内容。

Python,其机器学习和数据科学库(pandasKerasTensorFlowscikit-learnSciPyNumPy 等),以及大量可视化库(MatplotlibpyplotPlotly 等)对于初学者和专家来说都是优秀的自由及开源软件工具。它们易于学习,很受欢迎且受到社区支持,并拥有为数据科学而开发的最新技术和算法。它们是你在开始学习时可以获得的最佳工具集之一。

许多 Python 库都是建立在彼此之上的(称为依赖项),其基础是 NumPy 库。NumPy 专门为数据科学设计,经常被用于在其 ndarray 数据类型中存储数据集的相关部分。ndarray 是一种方便的数据类型,用于将关系表中的记录存储为 cvs 文件或其它任何格式,反之亦然。将 scikit 函数应用于多维数组时,它特别方便。SQL 非常适合查询数据库,但是对于执行复杂和资源密集型的数据科学操作,在 ndarray 中存储数据可以提高效率和速度(但请确保在处理大量数据集时有足够的 RAM)。当你使用 pandas 进行知识提取和分析时,pandas 中的 DataFrame 数据类型和 NumPy 中的 ndarray 之间的无缝转换分别为提取和计算密集型操作创建了一个强大的组合。

作为快速演示,让我们启动 Python shell 并在 pandas DataFrame 变量中加载来自巴尔的摩的犯罪统计数据的开放数据集,并查看加载的一部分 DataFrame:

>>>  import pandas as pd
>>>  crime_stats = pd.read_csv('BPD_Arrests.csv')
>>>  crime_stats.head()

我们现在可以在这个 pandas DataFrame 上执行大多数查询,就像我们可以在数据库中使用 SQL 一样。例如,要获取 Description 属性的所有唯一值,SQL 查询是:

$ SELECT unique(“Description”) from crime_stats;

利用 pandas DataFrame 编写相同的查询如下所示:

>>>  crime_stats['Description'].unique()
['COMMON   ASSAULT'   'LARCENY'   'ROBBERY   - STREET'   'AGG.   ASSAULT'
'LARCENY   FROM   AUTO'   'HOMICIDE'   'BURGLARY'   'AUTO   THEFT'
'ROBBERY   - RESIDENCE'   'ROBBERY   - COMMERCIAL'   'ROBBERY   - CARJACKING'
'ASSAULT   BY  THREAT'   'SHOOTING'   'RAPE'   'ARSON']

它返回的是一个 NumPy 数组(ndarray 类型):

>>>  type(crime_stats['Description'].unique())
<class   'numpy.ndarray'>

接下来让我们将这些数据输入神经网络,看看它能多准确地预测使用的武器类型,给出的数据包括犯罪事件,犯罪类型以及发生的地点:

>>>  from   sklearn.neural_network   import   MLPClassifier
>>>  import   numpy   as np
>>>
>>>  prediction   =  crime_stats[[‘Weapon’]]
>>>  predictors   =  crime_stats['CrimeTime',   ‘CrimeCode’,   ‘Neighborhood’]
>>>
>>>  nn_model   =  MLPClassifier(solver='lbfgs',   alpha=1e-5,   hidden_layer_sizes=(5,
2),   random_state=1)
>>>
>>>predict_weapon   =  nn_model.fit(prediction,   predictors)

现在学习模型准备就绪,我们可以执行一些测试来确定其质量和可靠性。对于初学者,让我们输入一个训练集数据(用于训练模型的原始数据集的一部分,不包括在创建模型中):

>>>  predict_weapon.predict(training_set_weapons)
array([4,   4,   4,   ..., 0,   4,   4])

如你所见,它返回一个列表,每个数字预测训练集中每个记录的武器。我们之所以看到的是数字而不是武器名称,是因为大多数分类算法都是用数字优化的。对于分类数据,有一些技术可以将属性转换为数字表示。在这种情况下,使用的技术是标签编码,使用 sklearn 预处理库中的 LabelEncoder 函数:preprocessing.LabelEncoder()。它能够对一个数据和其对应的数值表示来进行变换和逆变换。在这个例子中,我们可以使用 LabelEncoder()inverse_transform 函数来查看武器 0 和 4 是什么:

>>>  preprocessing.LabelEncoder().inverse_transform(encoded_weapons)
array(['HANDS',   'FIREARM',   'HANDS',   ..., 'FIREARM',   'FIREARM',   'FIREARM']

这很有趣,但为了了解这个模型的准确程度,我们将几个分数计算为百分比:

>>>  nn_model.score(X,   y)
0.81999999999999995

这表明我们的神经网络模型准确度约为 82%。这个结果似乎令人印象深刻,但用于不同的犯罪数据集时,检查其有效性非常重要。还有其它测试来做这个,如相关性、混淆、矩阵等。尽管我们的模型有很高的准确率,但它对于一般犯罪数据集并不是非常有用,因为这个特定数据集具有不成比例的行数,其列出 FIREARM 作为使用的武器。除非重新训练,否则我们的分类器最有可能预测 FIREARM,即使输入数据集有不同的分布。

在对数据进行分类之前清洗数据并删除异常值和畸形数据非常重要。预处理越好,我们的见解准确性就越高。此外,为模型或分类器提供过多数据(通常超过 90%)以获得更高的准确度是一个坏主意,因为它看起来准确但由于过度拟合而无效。

Jupyter notebooks 相对于命令行来说是一个很好的交互式替代品。虽然 CLI 对于大多数事情都很好,但是当你想要运行代码片段以生成可视化时,Jupyter 会很出色。它比终端更好地格式化数据。

这篇文章 列出了一些最好的机器学习免费资源,但是还有很多其它的指导和教程。根据你的兴趣和爱好,你还会发现许多开放数据集可供使用。作为起点,由 Kaggle 维护的数据集,以及在州政府网站上提供的数据集是极好的资源。


via: https://opensource.com/article/18/3/getting-started-data-science

作者:Payal Singh 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


          开源工具 | Python数据科学入门      Cache   Translate Page      

开源工具 | Python数据科学入门

不需要昂贵的工具即可领略数据科学的力量,从这些开源工具起步即可。

无论你是一个具有数学或计算机科学背景的资深数据科学爱好者,还是一个其它领域的专家,数据科学提供的可能性都在你力所能及的范围内,而且你不需要昂贵的,高度专业化的企业级软件。本文中讨论的开源工具就是你入门时所需的全部内容。

python ,其机器学习和数据科学库( pandas 、 Keras 、 TensorFlow 、 scikit-learn 、 SciPy 、 NumPy 等),以及大量可视化库( Matplotlib 、 pyplot 、 Plotly 等)对于初学者和专家来说都是优秀的自由及开源软件工具。它们易于学习,很受欢迎且受到社区支持,并拥有为数据科学而开发的最新技术和算法。它们是你在开始学习时可以获得的最佳工具集之一。

许多 Python 库都是建立在彼此之上的(称为依赖项),其基础是 NumPy 库。NumPy 专门为数据科学设计,经常被用于在其 ndarray 数据类型中存储数据集的相关部分。ndarray 是一种方便的数据类型,用于将关系表中的记录存储为 cvs 文件或其它任何格式,反之亦然。将 scikit 函数应用于多维数组时,它特别方便。SQL 非常适合查询数据库,但是对于执行复杂和资源密集型的数据科学操作,在 ndarray 中存储数据可以提高效率和速度(但请确保在处理大量数据集时有足够的 RAM)。当你使用 pandas 进行知识提取和分析时,pandas 中的 DataFrame 数据类型和 NumPy 中的 ndarray 之间的无缝转换分别为提取和计算密集型操作创建了一个强大的组合。

作为快速演示,让我们启动 Python shell 并在 pandas DataFrame 变量中加载来自巴尔的摩的犯罪统计数据的开放数据集,并查看加载的一部分 DataFrame:

>>> import pandas as pd >>> crime_stats =pd.read_csv('BPD_Arrests.csv') >>> crime_stats.head()
开源工具 | Python数据科学入门

我们现在可以在这个 pandas DataFrame 上执行大多数查询,就像我们可以在数据库中使用 SQL 一样。例如,要获取 Description 属性的所有唯一值,SQL 查询是:

$ SELECT unique(“Description”) from crime_stats;

利用 pandas DataFrame 编写相同的查询如下所示:

>>> crime_stats['Description'].unique() ['COMMON ASSAULT' 'LARCENY' 'ROBBERY - STREET' 'AGG. ASSAULT' 'LARCENY FROM AUTO' 'HOMICIDE' 'BURGLARY' 'AUTO THEFT' 'ROBBERY - RESIDENCE' 'ROBBERY - COMMERCIAL' 'ROBBERY - CARJACKING' 'ASSAULT BY THREAT' 'SHOOTING' 'RAPE' 'ARSON']

它返回的是一个 NumPy 数组(ndarray 类型):

>>>type(crime_stats['Description'].unique()) <class 'numpy.ndarray'>

接下来让我们将这些数据输入神经网络,看看它能多准确地预测使用的武器类型,给出的数据包括犯罪事件,犯罪类型以及发生的地点:

>>> from sklearn.neural_network import MLPClassifier >>> import numpy as np >>> >>> prediction = crime_stats[[‘Weapon’]] >>> predictors = crime_stats['CrimeTime', ‘CrimeCode’, ‘Neighborhood’] >>> >>> nn_model = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1) >>> >>>predict_weapon = nn_model.fit(prediction, predictors)

现在学习模型准备就绪,我们可以执行一些测试来确定其质量和可靠性。对于初学者,让我们输入一个训练集数据(用于训练模型的原始数据集的一部分,不包括在创建模型中):

>>>predict_weapon.predict(training_set_weapons) array([4, 4, 4, ..., 0, 4, 4])

如你所见,它返回一个列表,每个数字预测训练集中每个记录的武器。我们之所以看到的是数字而不是武器名称,是因为大多数分类算法都是用数字优化的。对于分类数据,有一些技术可以将属性转换为数字表示。在这种情况下,使用的技术是标签编码,使用 sklearn 预处理库中的 LabelEncoder 函数: preprocessing.LabelEncoder() 。它能够对一个数据和其对应的数值表示来进行变换和逆变换。在这个例子中,我们可以使用 LabelEncoder() 的 inverse_transform 函数来查看武器 0 和 4 是什么:

>>>preprocessing.LabelEncoder().inverse_transform(encoded_weapons) array(['HANDS', 'FIREARM', 'HANDS', ..., 'FIREARM', 'FIREARM', 'FIREARM']

这很有趣,但为了了解这个模型的准确程度,我们将几个分数计算为百分比:

>>>nn_model.score(X,y) 0.81999999999999995

这表明我们的神经网络模型准确度约为 82%。这个结果似乎令人印象深刻,但用于不同的犯罪数据集时,检查其有效性非常重要。还有其它测试来做这个,如相关性、混淆、矩阵等。尽管我们的模型有很高的准确率,但它对于一般犯罪数据集并不是非常有用,因为这个特定数据集具有不成比例的行数,其列出 FIREARM 作为使用的武器。除非重新训练,否则我们的分类器最有可能预测 FIREARM ,即使输入数据集有不同的分布。

在对数据进行分类之前清洗数据并删除异常值和畸形数据非常重要。预处理越好,我们的见解准确性就越高。此外,为模型或分类器提供过多数据(通常超过 90%)以获得更高的准确度是一个坏主意,因为它看起来准确但由于 过度拟合 而无效。

Jupyter notebooks 相对于命令行来说是一个很好的交互式替代品。虽然 CLI 对于大多数事情都很好,但是当你想要运行代码片段以生成可视化时,Jupyter 会很出色。它比终端更好地格式化数据。

这篇文章 列出了一些最好的机器学习免费资源,但是还有很多其它的指导和教程。根据你的兴趣和爱好,你还会发现许多开放数据集可供使用。作为起点,由 Kaggle 维护的数据集,以及在州政府网站上提供的数据集是极好的资源。

【责任编辑:庞桂玉 TEL:(010)68476606】


          TensorFlow Serving 1.12.0-0      Cache   Translate Page      
Released on Nov 07, 2018
          (USA-PA-Pittsburgh) Computer Vision / Deep Learning Engineer      Cache   Translate Page      
Computer Vision / Deep Learning Engineer Computer Vision / Deep Learning Engineer - Skills Required - Computer Vision, C++, Caffe, Tensorflow, Lidar, Geometry-Based Vision, Deep Learning, Multi-view stereo I am currently working with several companies in the area who are actively hiring in the field of Computer Vision and Deep Learning. AI, and specifically Computer Vision and Deep Learning are my niche market specialty and I only work with companies in this space. I am actively recruiting for multiple levels of seniority and responsibility, from experienced Individual Contributor roles, to Team Lead positions, to Principal Level Scientists and Engineers. I offer my candidates the unique proposition of representing them to multiple companies, rather than having to work with multiple different recruiters at an agency, or applying directly to many different companies without someone to manage the process with each of those opportunities. In one example, I am working with a candidate who is currently interviewing with 10 different clients of mine for similar roles across the country with companies applying Computer Vision and Deep Learning to various different applications from Robotics, Autonomous Vehicles, AR/VR/MR, Medical Imaging, Manufacturing Automation, Gaming, AI surveillance, AI Security, Facial ID, 3D Sensors and 3D Reconstruction software, Autonomous Drones, etc. I would love to work with you and introduce you to any of my clients you see as a great fit for your career! Please send me a resume and tell me a bit about yourself and I will reach out and offer some times to connect on the phone! **Top Reasons to Work with Us** Some of the current openings are for the following brief company overviews: Company 1 - company is founded by 3x Unicorn (multi-billion dollar companies) founders and are breaking into a new market with advanced technology, customers, and exciting applications including AI surveillance, robotics, AR/VR. Company 2 - Autonomous Drones! Actually, multiple different companies working on Autonomous Drones for different applications - including Air-to-Air Drone Security, Industrial Inspection, Consumer Drones, Wind Turbine and Structure Inspection. Company 3 - 3D Sensors and 3D Reconstruction Software - make 3D maps of interior spaces using our current products on the market. We work with builders, designers, Consumers and Business-to-Business solutions. Profitable company with strong leadership team currently in growth mode! Company 4 - Industrial/Manufacturing/Logistics automation using our 3D and Depth Sensors built in house and 3D Reconstruction software to automate processes for Fortune 500 clients. Solid funding and revenue approaching profitability in 2018! Company 5 - Hand Gesture Recognition technology for controlling AR/VR environments. We have a product on the market as of 2017 and are continuing to develop products for consumers and business applications that are used in the real and virtual world. We have recently brought on a renowned leader in Deep Learning and it's intersection with neuroscience and are doing groundbreaking R&D in this field! Company 6 - Full facial tracking and reconstruction for interactive AR/VR environments. Company 7 - massively scalable retail automation using Computer Vision and Deep Learning, currently partnered with one of the largest retailers in the world. Company 8 - Products in the market including 3D Sensors, and currently bringing 3D reconstruction capabilities to mobile devices everywhere. Recently closed on a $50M round of funding and expanding US operations. Company 9 - Mobile AI company using Computer Vision for sports tracking and real time analytics for players at all levels from beginner to professional athletes to track, practice and improve at their craft. Company 10 - Digitizing human actions to create a massive new dataset in manufacturing - augmenting the human/robot working relationship and giving manufacturers the necessary info to improve that relationship. We believe that AI and robotics will always need to work side by side with humans, and we are the only company providing a solution to this previously untapped dataset! Company 11 - 3D facial identification and authentication for security purposes. No more key-fobs and swipe cards, our clients use our sensors and software to identify and permit employees. **What You Will Be Doing** If you are interested in discussing any of these opportunities, I would love to speak with you! I am interested in learning about the work you are currently doing and what you would be interested in for your next step. If the above opportunities are not quite what you're looking for but would still like to discuss future opportunities and potential to work together, I would love to meet you! I provide a free service to my candidates and work diligently to help manage the stressful process of finding the right next step in your career. The companies that I work with are always evolving so I can keep you up to date on new opportunities I come across. Please apply to this job, or shoot me an email at richard.marion@cybercoders.com and let's arrange a time to talk on the phone. **What You Need for this Position** Generally, I am looking for Scientists/Engineers in the fields of Computer Vision, Deep Learning and Machine Learning. I find that a lot of my clients are looking for folks who have experience with 3D Reconstruction, SLAM / Visual Odometry, Object Detection/Recognition/Tracking, autonomy, Point Cloud Processing, Software and Algorithm development in C++ (and C++11 and C++14), GPU programming using CUDA or other GPGPU related stuff, Neural Network training, Sensor Fusion, Multi-view stereo, camera calibration or sensor calibration, Image Segmentation, Image Processing, Video Processing, and plenty more! - Computer Vision - C+- Python - Linux - UNIX **What's In It for You** A dedicated and experienced Computer Vision placement specialist! If you want to trust your job search in the hands of a professional who takes care and pride in their work, and will bring many relevant opportunities your way - I would love to work with you! So, if you are a Computer Vision Scientist or Engineer and are interested in having a conversation about the market and some of the companies I am working with, please apply or shoot me an email with resume today! Applicants must be authorized to work in the U.S. **CyberCoders, Inc is proud to be an Equal Opportunity Employer** All qualified applicants will receive consideration for employment without regard to race, color, religion, sex, national origin, disability, protected veteran status, or any other characteristic protected by law. **Your Right to Work** – In compliance with federal law, all persons hired will be required to verify identity and eligibility to work in the United States and to complete the required employment eligibility verification document form upon hire. *Computer Vision / Deep Learning Engineer* *PA-Pittsburgh* *RM2-1492758*
          20th Century Fox использует искусственный интеллект Merlin для оценки интереса к своим новым фильмам      Cache   Translate Page      

Искусственный интеллект сегодня везде. И пусть в большинстве случаев использование данного термина компаниями носит скорее маркетинговый характер, порой ИИ действительно полезен.

Как стало известно, компания 20th Century Fox использует систему искусственного интеллекта в процессе создания фильмов.

Используется он не в самом процессе съёмки или монтажа, а для оценки интереса аудитории. Система ИИ, которую назвали Merlin, анализирует трейлер и выдаёт прогноз касательно того, кто именно может прийти на такой фильм. Искусственный интеллект сравнивает новый трейлер с уже имеющимися в базе по ряду параметров. Он оценивает сцены, объекты в сценах, освещение, наличие или отсутствие различных деталей (волосы, кровь, оружие, лес и так далее), динамику сцен, наличие или отсутствие крупных кадров и так далее. Кроме того, эти параметры оцениваются не только сами по себе, но и в совокупности. В итоге алгоритм Merlin подбирает среди имеющихся в его базе трейлеров те, которые, по его мнению, схожи с новым, а это означает, что люди, смотревшие отобранные ИИ фильмы, заинтересуются и новой лентой.

Конечно, всё это пока далеко от идеала, но в целом система работает. В таблице ниже вы можете видеть оценку системой Merlin трейлера фильма «Логан». В правом столбце фильмы, которые отобрал Merlin, а в левом — результаты опросов людей.

Как видим, совпадений немало. Причём если наличие в списке Merlin супергеройских фильмов весьма ожидаемо, то, к примеру, наличие там картины «Джон Уик 2» демонстрирует то, что ИИ всё-таки способен улавливать менее наглядные параллели.

Система Merlin была создана в сотрудничестве с Google и использует открытую программную библиотеку TensorFlow. Вряд ли стоит сомневаться в том, что в недалёком будущем ИИ сможет делать подобный анализ намного более точно. Возможно, подобные системы лет через 10 и вовсе будут участвовать в создании фильмов, подсказывая, какие именно детали нужно внести в ленту, чтобы лучше попасть в целевую аудиторию.

Теги: искусственный интеллект

Комментировать


          Emotional intelligente Apps mit NativeScript und TensorFlow      Cache   Translate Page      

Langweilige Apps waren gestern, heute geht es um empathische Apps, die auf den Nutzer eingehen. Mit NativeScript und TensorFlow lassen sich solche Apps entwickeln, wie Jen Looper in dieser Session von der International JavaScript Conference London 2018 zeigt.

Der Beitrag Emotional intelligente Apps mit NativeScript und TensorFlow ist auf entwickler.de erschienen.


          AMD推出适用AI和HPC的MI60/MI50加速器      Cache   Translate Page      

【手机中国新闻】AMD周二推出了Radeon Instinct MI60和MI50,这是一款专为下一代深度学习,HPC,云计算和渲染应用程序而设计的加速器。 AMD表示这是世界上第一个具备7nm GPU的数据芯片。

供高达7.4 TFLOPS的 FP64峰值性能,这将使科学家和研究人员能够更有效地处理HPC应用。 AMD指出,这些应用涵盖了生命科学、能源、金融、汽车、航空航天和国防等众多行业。 MI50可提供高达6.7 TFLOPS的FP64峰值性能。

Radeon Instinct MI60
Radeon Instinct MI60

加速器为动态工作负载提供灵活的混合精度FP16,FP32和INT4 / INT8功能,例如训练复杂神经网络或针对受过训练的网络进行推理。AMD的Radeon技术集团工程高级副总裁David Wang在一份声明中表示, “传统的GPU架构限制了IT管理人员应对云数据中心不断变化的工作负载需求,不能有效地处理和分析的大型数据集。”

这些加速器的每个GPU具有两个无限结构链路,可提供高达200 GB / s的点对点带宽,通信速度比PCIe Gen 3互连速度快6倍。蜂巢环配置还可以连接多达四个GPU。
AMD表示,它们也是第一款能够支持下一代PCIe 4.0互连的GPU,其速度比其他x86 CPU-to-GPU互连技术快2倍。

MI60提供32GB的HBM2(第二代高带宽内存)纠错码(ECC)内存,MI50提供16GB的HBM2 ECC内存。MI60预计将在2018年底之前发货给数据中心客户,而MI50预计将在2019年第一季度末开始出货。

AMD还宣布推出新版ROCm,这是一种独立于开源编程语言的HPC / Hyperscale级GPU计算平台。 ROCm软件版本2.0支持新的Radeon Instinct加速器,它为新的优化深度学习操作(DLOPS)提供更新的数学库。它还支持64位Linux操作系统,包括CentOS,RHEL和Ubuntu。此外,它还支持流行的最新版本的深度学习框架,包括TensorFlow 1.11,PyTorch(Caffe2)等。ROCm 2.0软件平台预计将于2018年底上市。

AMD EPYC
AMD EPYC

Moor Insights&Strategy的创始人帕特里克·莫尔黑德(Patrick Moorhead)表示,凭借Radeon Instinct的7nm设计,“AMD从硬件方向推动了这一领域的发展。我对其1TB内存带宽,与EPYC和Infinity Fabric的协同功能感到印象深刻,”Moorhead在一份声明中说,“我相信它是否成功将由ROCM2软件在客户工作流程中的使用情况决定。AMD Radeon一直拥有良好的硬件产品。只有当硬件和软件一起上市才能完全发挥产品的优势。”


          AMD Unveils World's First 7nm Datacenter GPUs with PCIe 4.02 Interconnect      Cache   Translate Page      
AMD unveiled the world's first lineup of 7nm GPUs for the datacenter that will utilize an all new version of the ROCM open software platform for accelerated computing. "The AMD Radeon Instinct MI60 and MI50 accelerators feature flexible mixed-precision capabilities, powered by high-performance compute units that expand the types of workloads these accelerators can address, including a range of HPC and deep learning applications." They are specifically designed to tackle datacenter workloads such as rapidly training complex neural networks, delivering higher levels of floating-point performance, while exhibiting greater efficiencies. The new "Vega 7nm" GPUs are also the world's first GPUs to support the PCIe 4.02 interconnect which is twice as fast as other x86 CPU-to-GPU interconnect technologies and features AMD Infinity Fabric Link GPU interconnect technology that enables GPU-to-GPU communication that is six times faster than PCIe Gen 3. The AMD Radeon Instinct MI60 Accelerator is also the world's fastest double precision PCIe accelerator with 7.4 TFLOPs of peak double precision (FP64) performance. "Google believes that open source is good for everyone," said Rajat Monga, engineering director, TensorFlow, Google. "We've seen how helpful it can be to open source machine learning technology, and we're glad to see AMD embracing it. With the ROCm open software platform, TensorFlow users will benefit from GPU acceleration and a more robust open source machine learning ecosystem." ROCm software version 2.0 provides updated math libraries for the new DLOPS; support for 64-bit Linux operating systems including CentOS, RHEL and Ubuntu; optimizations of existing components; and support for the latest versions of the most popular deep learning frameworks, including TensorFlow 1.11, PyTorch (Caffe2) and others. Discussion
          Linear Regression – Machine Learning with TensorFlow and Oracle JET UI Explained by Andrejus ...      Cache   Translate Page      
image

Machine learning topic is definitely popular these days. Some get wrong assumptions about it - they think machine could learn by itself and its kind of magic. The truth is - there is no magic, but math behind it. Machine will learn the way math model is defined for learning process. In my opinion, the best solution is a combination of machine learning math and algorithms.  Here I could relate to chatbots keeping conversational context - language processing can be done by machine learning with neural network, while intent and context processing can be executed by programmable algorithms.
If you are starting to learn machine learning - there are two essential concepts to start with:
1. Regression
2. Classification
This post is focused around regression, in the next posts I will talk about classification.
Regression is a method which calculates the best fit for a curve to summarize data. Its up to you which type of curve to choose, you should assume which type will be most suitable (this can be achieved with trial and error too) based on given data set. Regression goal is to understand data points by discovering the curve that might have generated them. Read the complete article here.

 

Developer Partner Community

For regular information become a member in the WebLogic Partner Community please visit: http://www.oracle.com/partners/goto/wls-emea ( OPN account required). If you need support with your account please contact the Oracle Partner Business Center.

Blog Twitter LinkedIn Forum Wiki

Technorati Tags: PaaS,Cloud,Middleware Update,WebLogic, WebLogic Community,Oracle,OPN,Jürgen Kress


          Images Learning and classification      Cache   Translate Page      
We need to develop a AI Functionality where we would be able to identify object from a set of images to classify images that corresponds to a selfie. Our images are eterogenous and we provide images file and metadata in a CSV file... (Budget: €250 - €750 EUR, Jobs: Elasticsearch, PHP, Python, Software Architecture, Tensorflow)
          纳德拉会面中国开发者,推进微软智能云生态      Cache   Translate Page      

微软CEO纳德拉日前在华与开发者代表会面,进一步推动微软云计算和人工智能的开放生态。11月6日,纳德拉在北京与来自码隆科技、才云科技、开源中国社区和Kyligence等五组开发者代表就人工智能和开源生态等话题了进行了深入探讨。纳德拉表示,中国实体经济存在着巨大的数字化转型机遇,人工智能开发者在其中扮演关键角色。微软希望通过领先业界的云计算和人工智能服务,予力中国开发者和合作伙伴打造属于自己的人工智能应用,释放中国智慧,发现中国机遇。

 

Al开发者代表码隆科技联合创始人黄鼎隆现场展示了码隆科技最新的人工智能商品识别解决方案,并分享了人工智能与中国垂直行业相结合的潜在机会。他表示, Al能极大地助力实体经济转型升级、提升生产力,码隆是微软智能云Azure的忠实用户,希望能借助微软智能云平台Azure的全球优势,拓展国际业务,深入行业为更多企业打造更高效的AI解决方案。

 

云原生开发者代表才云科技创始人张鑫与纳德拉畅聊如何实现人工智能的“最后一公里配送”以及如何将有中国特色的Al应用场景带向全球,通过开放的AI平台赋能企业开发者,实现“人工智能飞入千家万户”。他表示,基于Azure智能云和人工智能技术,才云科技帮助跨国企业客户成功在混合云上打造O2O服务,通过容器化AI技术帮助其迅速处理大量订单。对此,纳德拉表示将充分发挥微软的平台优势,将更多Azure的全球功能和服务带到中国,帮助开发者将中国用户案例推广和应用到海外市场。

 


微软的云计算服务Azure,至今为止已在中国市场运营了四年,这与纳德拉当上微软CEO的时间几乎同步,而在此之前,纳德拉正是Azure的负责人。微软以传统软件巨头的身份,能认识到云计算的价值并奋力获得在该市场的一个显著地位,与纳德拉的推动密不可分。他正确认识到发展云计算的紧迫性和重要性,打破微软传统,在Azure加大对开源数据的支持,全力推动Azure入华等意识与行动,使得云计算成为微软体系内连续数年增长最快的业务。

 

作为首个实现在华商用的国际公有云服务,Azure在华连续四年实现了三位数增长,拥有了超过1300家解决方案合作伙伴和超过10万名活跃开发者。2018年微软在华商用了Azure Stack 混合云解决方案,Azure完成了云计算规模的三倍扩容,还计划在中国同时增加两个Azure区域、两个数据中心,将其全球云覆盖区域扩充到54个,超过全球所有公有云提供商。截至目前,超过 95%的全球“财富 500 强”企业都在采用微软云服务。

 

当然,Azure入华这四年,更为重要的是2016年开始提供的Azure认知服务,也就是国内通俗所称的人工智能服务。这一举措产生的背景是人工智能研发与应用热潮的兴起,各种大大小小的创业公司雨后春笋般涌现,微软不失时机地在Azure中推出认知服务,其中包含语音、视觉、语言、机器翻译等24项功能,以提供API的方式为开发者提供人工智能开发平台。目前Azure认知服务在全球有超过100万开发者,中国开发者超过10万。这一次的微软,在对全新动向的反应速度和行动力方面,令人耳目一新。

 

在人工智能发展大潮下,未来的云计算是否还会是过去的云计算概念,这是个很深刻的主题。微软选择的方向是,将云计算和人工智能结合起来,其价值观体现为“智能云和智能边缘”,即以人工智能云为核心,与周围的智能边缘融会贯通,而在智能云上,将集合微软在人工智能方面的所有技术积累与成果。目前的Azure包括公有云Azure、混合云Azure Stack、物联网Azure IoT Edge,另外还有起安全保护作用的Azure Sphere等部分,可说是覆盖了智能云的所有领域,集成了微软的主要技术能力。

 

此外,日前在上海举办的2018微软技术暨生态大会上,微软宣布Dynamics 365企业应用云平台将于2019年春季落地中国。届时,微软智能云的“三驾马车”,Microsoft Azure云计算平台、Office365云生产力平台、Dynamics 365企业应用云平台将齐聚中国市场,覆盖个人、企业、开发者等所有市场需求。微软认识到中国正处在急剧变化的数字化转型过程中,智能云的需求即将出现井喷,为此微软对中国市场进行了大举投入,与本土运营商密切合作提供服务,意欲为数字化转型提供强大助力。

 


微软所主张的这个智能云是开放的,不但平台开放,努力提供开发工具,甚至还可以支持TensorFlow、CNTK等其他第三方深度学习平台。在2018年的微软开发者大会上,微软还推出了跨平台、开源机器学习框架ML.NET开放预览。ML.NET可以让任何开发者都能开发出自己的定制化机器学习模型,并将其融入到自己的应用中去,而开发者完全无需具备开发和调试机器学习模型的经验。所有这些微软为AI研发应用大幅降低门槛的动作,都显示出微软在人工智能方面抱有的坚定决心。

 

用雄厚的资源和技术实力搭建起平台后,将平台变得越来越开放以吸引开发者,汇聚智力和创新力以进一步提升平台的竞争力,这是所有平台建设过程中的既有路线。开发者是平台的创新动力,而在吸引开发者加入进来这件事上,微软在中国有着其非常雄厚的优势。微软落地中国已有26年之久,微软中国研究院也在今年迎来了20岁生日,长期经营中国市场使其积累下丰富的经验,对中国市场的认知与理解远超其他跨国公司。基于这些状况,微软在中国的投资和拓展都是长期性的,并与中国合作伙伴保持了持久而良好的关系。

 

微软目前在中国拥有170,900家合作伙伴和40万左右的开发者,其中有10万是人工智能平台的开发者,由于人工智能应用落地热潮在中国方兴正艾,预计这个数字未来几年还将快速上涨。在吸引中国开发者方面,微软并没有依仗技术实力而展现高高在上的姿态,而是耐心细致地从头做起,将吸引开发者加入的具体条件都梳理清楚后加以完善。三年前微软推出了在中国的孵化计划,目前为止在全国已设立了至少26家以上的孵化平台,其中有3个是国家级的,4个是省级的众创空间,累计孵化创新企业高达600多家,其中两家已成长为亿级独角兽。

 

在孵化计划之上,微软还引入全球性的加速器项目,帮助有实力和潜质的初创企业快速成长,本次与纳德拉面对面交流的码隆科技、才云科技和Kyligence,就是微软加速器计划的一员。微软在全球有8个加速器,其中两个在中国,而最早的北京加速器在2012年就已启动。在北京和上海的这两个微软加速器,建立以来已累计为231家国内新创企业进行了加速,其中上海加速器的校友企业总估值超过556亿元人民币,北京加速器校友企业总估值超过了854.87亿元人民币。

 

上述所有微软所做的事情,彼此之间都有相关性,最终落实到吸引合作者和开发者这一点上,使得微软在这方面的优势非常突出。正是因为微软看到了中国巨大的数字化转型机遇,希望能够更为深度地参与到中国市场中来,才有了不断在中国加码长期建设,将自身对合作者与开发者的友好度不断提升。与国内发展人工智能的多数公司相比,微软所做的事情并不算快,但足够扎实,其计划和举措并不虚浮,而是扎实有内容,从源头做起用切实的行动扶持国内的创新力量,而非仅许以承诺和保证。未来几年微软将继续深化本地合作,深度参与数字化转型大潮。

 

过去几年,人工智能越来越受到各级政府的重视与支持,在国家战略中的地位不断提升。这是个需要各方通力协作,不断将创新能力引领出来的工作。人工智能的发展不但依赖创新,还急需开发工具和生态平台,在这方面微软有着很强的实力足以成为重要的参与者。微软在云计算和人工智能方面的发展战略,与中国市场的发展走向高度吻合,活跃而有创造力的新创势力,庞大的人口市场红利,深耕中国20多年的微软,不会错过这个重大机会,将尽全力在中国市场开辟一片新的天地。


 
          Mesh-TensorFlow: Deep Learning for Supercomputers. (arXiv:1811.02084v1 [cs.LG])      Cache   Translate Page      

Authors: Noam Shazeer, Youlong Cheng, Niki Parmar, Dustin Tran, Ashish Vaswani, Penporn Koanantakool, Peter Hawkins, HyoukJoong Lee, Mingsheng Hong, Cliff Young, Ryan Sepassi, Blake Hechtman

Batch-splitting (data-parallelism) is the dominant distributed Deep Neural Network (DNN) training strategy, due to its universal applicability and its amenability to Single-Program-Multiple-Data (SPMD) programming. However, batch-splitting suffers from problems including the inability to train very large models (due to memory constraints), high latency, and inefficiency at small batch sizes. All of these can be solved by more general distribution strategies (model-parallelism). Unfortunately, efficient model-parallel algorithms tend to be complicated to discover, describe, and to implement, particularly on large clusters. We introduce Mesh-TensorFlow, a language for specifying a general class of distributed tensor computations. Where data-parallelism can be viewed as splitting tensors and operations along the "batch" dimension, in Mesh-TensorFlow, the user can specify any tensor-dimensions to be split across any dimensions of a multi-dimensional mesh of processors. A Mesh-TensorFlow graph compiles into a SPMD program consisting of parallel operations coupled with collective communication primitives such as Allreduce. We use Mesh-TensorFlow to implement an efficient data-parallel, model-parallel version of the Transformer sequence-to-sequence model. Using TPU meshes of up to 512 cores, we train Transformer models with up to 5 billion parameters, surpassing state of the art results on WMT'14 English-to-French translation task and the one-billion-word language modeling benchmark. Mesh-Tensorflow is available at https://github.com/tensorflow/mesh .


          Simple, Distributed, and Accelerated Probabilistic Programming. (arXiv:1811.02091v1 [stat.ML])      Cache   Translate Page      

Authors: Dustin Tran, Matthew Hoffman, Dave Moore, Christopher Suter, Srinivas Vasudevan, Alexey Radul, Matthew Johnson, Rif A. Saurous

We describe a simple, low-level approach for embedding probabilistic programming in a deep learning ecosystem. In particular, we distill probabilistic programming down to a single abstraction---the random variable. Our lightweight implementation in TensorFlow enables numerous applications: a model-parallel variational auto-encoder (VAE) with 2nd-generation tensor processing units (TPUv2s); a data-parallel autoregressive model (Image Transformer) with TPUv2s; and multi-GPU No-U-Turn Sampler (NUTS). For both a state-of-the-art VAE on 64x64 ImageNet and Image Transformer on 256x256 CelebA-HQ, our approach achieves an optimal linear speedup from 1 to 256 TPUv2 chips. With NUTS, we see a 100x speedup on GPUs over Stan and 37x over PyMC3.


          geomstats: a Python Package for Riemannian Geometry in Machine Learning. (arXiv:1805.08308v2 [cs.LG] UPDATED)      Cache   Translate Page      

Authors: Nina Miolane, Johan Mathe, Claire Donnat, Mikael Jorda, Xavier Pennec

We introduce geomstats, a python package that performs computations on manifolds such as hyperspheres, hyperbolic spaces, spaces of symmetric positive definite matrices and Lie groups of transformations. We provide efficient and extensively unit-tested implementations of these manifolds, together with useful Riemannian metrics and associated Exponential and Logarithm maps. The corresponding geodesic distances provide a range of intuitive choices of Machine Learning loss functions. We also give the corresponding Riemannian gradients. The operations implemented in geomstats are available with different computing backends such as numpy, tensorflow and keras. We have enabled GPU implementation and integrated geomstats manifold computations into keras deep learning framework. This paper also presents a review of manifolds in machine learning and an overview of the geomstats package with examples demonstrating its use for efficient and user-friendly Riemannian geometry.


          tftextembeddinghub added to PyPI      Cache   Translate Page      
TensorFlow Hub module producer for text embedding lookup
          tfds-nightly added to PyPI      Cache   Translate Page      
tensorflow/datasets is a library of datasets ready to use with TensorFlow.
          bullseye-method added to PyPI      Cache   Translate Page      
Implemented tensorflow version of the Bullseye method for prior approximation.
          C. Bircanoğlu - Image Generation with Tensorflow (GANs)      Cache   Translate Page      
none
          Remote Voice Biometrics Data Scientist      Cache   Translate Page      
A technology company has a current position open for a Remote Voice Biometrics Data Scientist. Core Responsibilities of this position include: Collecting/processing large volumes of voice recordings and extract voice features Constructing machine learning pipelines Writing scientific papers Skills and Requirements Include: Experience with Tensorflow, Caffe2, Theano, CNTK, Torch, NLTK Understanding of statistical methods of data analysis, machine learning, etc Experience with acoustic data processing, audio codecs, and speaker identification Knowledge of relevant programming languages: Python, Java, C++, R Background in computer science, mathematics, acoustics, or related
          深度剖析阿里巴巴对 Apache Flink 的优化与改进      Cache   Translate Page      

Apache Flink 概述

Apache Flink(以下简称 Flink)是诞生于欧洲的一个大数据研究项目,原名 StratoSphere。该项目是柏林工业大学的一个研究性项目,早期专注于批计算。2014 年,StratoSphere 项目中的核心成员孵化出 Flink,并在同年将 Flink 捐赠 Apache,后来 Flink 顺利成为 Apache 的顶级大数据项目。同时 Flink 计算的主流方向被定位为流计算,即用流式计算来做所有大数据的计算工作,这就是 Flink 技术诞生的背景。

2014 年 Flink 作为主攻流计算的大数据引擎开始在开源大数据行业内崭露头角。区别于 Storm、Spark Streaming 以及其他流式计算引擎的是:它不仅是一个高吞吐、低延迟的计算引擎,同时还提供很多高级功能。比如它提供有状态的计算,支持状态管理,支持强一致性的数据语义以及支持 Event Time、WaterMark 对消息乱序的处理等。

Flink 的受欢迎还离不开它身上的众多标签,其中包括性能优秀(尤其在流计算领域)、高可扩展性、支持容错,是一种纯内存式的一个计算引擎,做了内存管理方面的大量优化,另外也支持 eventime 的处理、支持超大状态的 Job(在阿里巴巴中作业的 state 大小超过 TB 的是非常常见的)、支持 exactly-once 的处理。

阿里巴巴与 Flink

随着人工智能时代的降临,数据量的爆发,在典型的大数据的业务场景下数据业务最通用的做法是:选用批处理的技术处理全量数据,采用流式计算处理实时增量数据。在绝大多数的业务场景之下,用户的业务逻辑在批处理和流处理之中往往是相同的。但是,用户用于批处理和流处理的两套计算引擎是不同的。

因此,用户通常需要写两套代码。毫无疑问,这带来了一些额外的负担和成本。阿里巴巴的商品数据处理就经常需要面对增量和全量两套不同的业务流程问题,所以阿里巴巴就在想:能不能有一套统一的大数据引擎技术,用户只需要根据自己的业务逻辑开发一套代码。这样在各种不同的场景下,不管是全量数据还是增量数据,亦或者实时处理,一套方案即可全部支持,这就是阿里巴巴选择 Flink 的背景和初衷。

基于 Flink 在阿里巴巴搭建的平台于 2016 年正式上线,并从阿里巴巴的搜索和推荐这两大场景开始实现。目前阿里巴巴所有的业务,包括阿里巴巴所有子公司都采用了基于 Flink 搭建的实时计算平台。同时 Flink 计算平台运行在开源的 Hadoop 集群之上。采用 Hadoop 的 YARN 做为资源管理调度,以 HDFS 作为数据存储。因此,Flink 可以和开源大数据软件 Hadoop 无缝对接。

目前,这套基于 Flink 搭建的实时计算平台不仅服务于阿里巴巴集团内部,而且通过阿里云的云产品API向整个开发者生态提供基于 Flink 的云产品支持。

彼时的 Flink 不管是规模还是稳定性尚未经历实践,成熟度有待商榷。阿里巴巴实时计算团队决定在阿里内部建立一个 Flink 分支 Blink,并对 Flink 进行大量的修改和完善,让其适应阿里巴巴这种超大规模的业务场景。在这个过程当中,该团队不仅对 Flink 在性能和稳定性上做出了很多改进和优化,同时在核心架构和功能上也进行了大量创新和改进,并将逐渐推回给社区,例如:Flink 新的分布式架构,增量 Checkpoint 机制,基于 Credit-based 的网络流控机制和 Streaming SQL 等。接下来,我们主要从两个层面深度剖析阿里巴巴对Flink究竟做了哪些优化?

取之开源,用之开源

SQL 层

为了能够真正做到用户根据自己的业务逻辑开发一套代码,能够同时运行在多种不同的场景,Flink 首先需要给用户提供一个统一的 API。在经过一番调研之后,阿里巴巴实时计算认为 SQL 是一个非常适合的选择。在批处理领域,SQL 已经经历了几十年的考验,是公认的经典。在流计算领域,近年来也不断有流表二象性、流是表的 ChangeLog 等理论出现。在这些理论基础之上,阿里巴巴提出了动态表的概念,使得流计算也可以像批处理一样使用 SQL 来描述,并且逻辑等价。这样一来,用户就可以使用 SQL 来描述自己的业务逻辑,相同的查询语句在执行时可以是一个批处理任务,也可以是一个高吞吐低延迟的流计算任务,甚至是先使用批处理技术进行历史数据的计算,然后自动的转成流计算任务处理最新的实时数据。在这种声明式的 API 之下,引擎有了更多的选择和优化空间。接下来,我们将介绍其中几个比较重要的优化。

首先是对 SQL 层的技术架构进行升级和替换。调研过 Flink 或者使用过 Flink 的开发者应该知道,Flink 有两套基础的 API,一套是 DataStream,另一套是 DataSet。DataStream API 是针对流式处理的用户提供,DataSet API 是针对批处理用户提供,但是这两套 API 的执行路径是完全不一样的,甚至需要生成不同的 Task 去执行。Flink 原生的 SQL 层在经过一系列优化之后,会根据用户希望是批处理还是流处理的不同选择,去调用 DataSet 或者是 DataStream API。这就会造成用户在日常开发和优化中,经常要面临两套几乎完全独立的技术栈,很多事情可能需要重复的去做两遍。这样也会导致在一边的技术栈上做的优化,另外一边就享受不到。因此阿里巴巴在 SQL 层提出了全新的 Quyer Processor,它主要包括一个流和批可以尽量做到复用的优化层(Query Optimizer)以及基于相同接口的算子层(Query Executor)。这样一来, 80% 以上的工作可以做到两边复用,比如一些公共的优化规则,基础数据结构等等。同时,流和批也会各自保留自己一些独特的优化和算子,以满足不同的作业行为。

在 SQL 层的技术架构统一之后,阿里巴巴开始寻求一种更高效的基础数据结构,以便让 Blink 在 SQL 层的执行更加高效。在原生 Flink SQL中,都统一使用了一种叫 Row 的数据结构,它完全由 Java 的一些对象构成关系数据库中的一行。假如现在的一行数据由一个整型,一个浮点型以及一个字符串组成,那么 Row 当中就会包含一个 Java 的 Integer、Double 和 String。众所周知,这些 Java 的对象在堆内有不少的额外开销,同时在访问这些数据的过程中也会引入不必要的装箱拆箱操作。基于这些问题,阿里巴巴提出了一种全新的数据结构 BinaryRow,它和原来的 Row 一样也是表示一个关系数据中的一行,但与之不同的是,它完全使用二进制数据来存储这些数据。在上述例子中,三个不同类型的字段统一由 Java 的 byte[] 来表示。这会带来诸多好处:

  • 首先在存储空间上,去掉了很多无谓的额外消耗,使得对象的存储更为紧凑;
  • 其次在和网络或者状态存储打交道的时候,也可以省略掉很多不必要的序列化反序列化开销;
  • 最后在去掉各种不必要的装箱拆箱操作之后,整个执行代码对 GC 也更加友好。

通过引入这样一个高效的基础数据结构,整个 SQL 层的执行效率得到了一倍以上的提升。 

在算子的实现层面,阿里巴巴引入了更广范围的代码生成技术。得益于技术架构和基础数据结构的统一,很多代码生成技术得以达到更广范围的复用。同时由于 SQL 的强类型保证,用户可以预先知道算子需要处理的数据的类型,从而可以生成更有针对性更高效的执行代码。在原生 Flink SQL 中,只有类似 a > 2 或者 c + d 这样的简单表达式才会应用代码生成技术,在阿里巴巴优化之后,有一些算子会进行整体的代码生成,比如排序、聚合等。这使得用户可以更加灵活的去控制算子的逻辑,也可以直接将最终运行代码嵌入到类当中,去掉了昂贵的函数调用开销。一些应用代码生成技术的基础数据结构和算法,比如排序算法,基于二进制数据的 HashMap 等,也可以在流和批的算子之间进行共享和复用,让用户真正享受到了技术和架构的统一带来的好处。在针对批处理的某些场景进行数据结构或者算法的优化之后,流计算的性能也能够得到提升。接下来,我们聊聊阿里巴巴在 Runtime 层对 Flink 又大刀阔斧地进行了哪些改进。

Runtime 层

为了让 Flink 在阿里巴巴的大规模生产环境中生根发芽,实时计算团队如期遇到了各种挑战,首当其冲的就是如何让 Flink 与其他集群管理系统进行整合。Flink 原生集群管理模式尚未完善,也无法原生地使用其他其他相对成熟的集群管理系统。基于此,一系列棘手的问题接连浮现:多租户之间资源如何协调?如何动态的申请和释放资源?如何指定不同资源类型? 

为了解决这个问题,实时计算团队经历大量的调研与分析,最终选择的方案是改造 Flink 资源调度系统,让 Flink 可以原生地跑在 YARN 集群之上;并且重构 Master 架构,让一个 Job 对应一个 Master,从此 Master 不再是集群瓶颈。以此为契机,阿里巴巴和社区联手推出了全新的 Flip-6 架构,让 Flink 资源管理变成可插拔的架构,为 Flink 的可持续发展打下了坚实的基础。如今 Flink 可以无缝运行在 YARN、Mesos 和 K8S 之上,正是这个架构重要性的有力说明。

解决了 Flink 集群大规模部署问题后,接下来的就是可靠和稳定性,为了保证 Flink 在生产环境中的高可用,阿里巴巴着重改善了 Flink 的 FailOver 机制。首先是 Master 的 FailOver,Flink 原生的 Master FailOver 会重启所有的 Job,改善后 Master 任何 FailOver 都不会影响 Job 的正常运行;其次引入了 Region-based 的 Task FailOver,尽量减少任何 Task 的 FailOver 对用户造成的影响。有了这些改进的保驾护航,阿里巴巴的大量业务方开始把实时计算迁移到 Flink 上运行。

Stateful Streaming 是 Flink 的最大亮点,基于 Chandy-Lamport 算法的 Checkpoint 机制让 Flink 具备 Exactly Once 一致性的计算能力,但在早期 Flink 版本中 Checkpoint 的性能在大规模数据量下存在一定瓶颈,阿里巴巴也在 Checkpoint 上进行了大量改进,比如:

  • 增量 Checkpoint 机制:阿里巴巴生产环境中遇到大 Job 有几十 TB State 是常事,做一次全量 CP 地动山摇,成本很高,因此阿里巴巴研发了增量 Checkpoint 机制,从此之后 CP 从暴风骤雨变成了细水长流;
  • Checkpoint 小文件合并:都是规模惹的祸,随着整个集群 Flink Job 越来越多,CP 文件数也水涨船高,最后压的 HDFS NameNode 不堪重负,阿里巴巴通过把若干 CP 小文件合并成一个大文件的组织方式,最终把 NameNode 的压力减少了几十倍。

虽然说所有的数据可以放在 State 中,但由于一些历史的原因,用户依然有一些数据需要存放在像 HBase 等一些外部 KV 存储中,用户在 Flink Job 需要访问这些外部的数据,但是由于 Flink 一直都是单线程处理模型,导致访问外部数据的延迟成为整个系统的瓶颈,显然异步访问是解决这个问题的直接手段,但是让用户在 UDF 中写多线程同时还要保证 ExactlyOnce 语义,却并非易事。阿里巴巴在Flink中提出了 AsyncOperator,让用户在 Flink Job 中写异步调用和写“Hello Word”一样简单 ,这个让 Flink Job 的吞吐有了很大的飞跃。

Flink 在设计上是一套批流统一的计算引擎,在使用过快如闪电的流计算之后,批用户也开始有兴趣入住 Flink 小区。但批计算也带来了新的挑战,首先在任务调度方面,阿里巴巴引入了更加灵活的调度机制,能够根据任务之间的依赖关系进行更加高效的调度;其次就是数据 Shuffle,Flink 原生的S huffle Service 和 TM 绑定,任务执行完之后要依旧保持 TM 无法释放资源;还有就是原有的 Batch shuffle 没有对文件进行合并,所以基本无法在生产中使用。阿里巴巴开发了 Yarn Shuffle Service 功能的同时解决了以上两个问题。在开发 Yarn Shuffle Service 的时候,阿里巴巴发现开发一套新的 Shuffle Service 非常不便,需要侵入 Flink 代码的很多地方,为了让其他开发者方便的扩展不同 Shuffle,阿里巴巴同时改造了 Flink Shuffle 架构,让 Flink 的 Shuffle 变成可插拔的架构。目前阿里巴巴的搜索业务已经在使用 Flink Batch Job,并且已经开始服务于生产。 

经过 3 年多打磨,Blink 已经在阿里巴巴开始茁壮生长,但是对 Runtime 的优化和改进是永无止境的,一大波改进和优化正在路上。

Flink 的未来方向

目前 Flink 已经是一个主流的流计算引擎,社区下一步很重要的工作是让 Flink 在批计算上有所突破,在更多的场景下落地,成为一种主流的批计算引擎。然后进一步在流和批之间进行无缝的切换,流和批的界限越来越模糊。用 Flink,在一个计算中,既可以有流计算,又可以有批计算。 

接下来阿里巴巴将致力于推动 Flink 在生态上得到更多语言的支持,不仅仅是 Java、Scala 语言,甚至是机器学习下用的 Python、Go 语言。

另一点不得不说 AI,因为现在很多大数据计算的需求和数据量都是在支持很火爆的 AI 场景,所以 Flink 在流批生态完善的基础上,将继续完善上层的 Machine Learning 算法库,同时 Flink 也会向更成熟的机器学习、深度学习去集成。比如可以做 Tensorflow On Flink, 让大数据的 ETL 数据处理和机器学习的 Feature 计算和特征计算,训练的计算等进行集成,让开发者能够同时享受到多种生态给大家带来的好处。

最后,从生态、社区的活跃来说,阿里巴巴目前在推进的一件事情是筹备 2018 年 12 月 20 日 - 21 日在国家会议中心举办的首届 Flink Forward China 峰会(千人规模),参与者将有机会了解阿里巴巴、腾讯、华为、滴滴、美团、字节跳动等公司为何将 Flink 作为首选的流处理引擎。

报名链接:https://dwz.cn/a4lHAVgW




Next Page: 10000

Site Map 2018_01_14
Site Map 2018_01_15
Site Map 2018_01_16
Site Map 2018_01_17
Site Map 2018_01_18
Site Map 2018_01_19
Site Map 2018_01_20
Site Map 2018_01_21
Site Map 2018_01_22
Site Map 2018_01_23
Site Map 2018_01_24
Site Map 2018_01_25
Site Map 2018_01_26
Site Map 2018_01_27
Site Map 2018_01_28
Site Map 2018_01_29
Site Map 2018_01_30
Site Map 2018_01_31
Site Map 2018_02_01
Site Map 2018_02_02
Site Map 2018_02_03
Site Map 2018_02_04
Site Map 2018_02_05
Site Map 2018_02_06
Site Map 2018_02_07
Site Map 2018_02_08
Site Map 2018_02_09
Site Map 2018_02_10
Site Map 2018_02_11
Site Map 2018_02_12
Site Map 2018_02_13
Site Map 2018_02_14
Site Map 2018_02_15
Site Map 2018_02_15
Site Map 2018_02_16
Site Map 2018_02_17
Site Map 2018_02_18
Site Map 2018_02_19
Site Map 2018_02_20
Site Map 2018_02_21
Site Map 2018_02_22
Site Map 2018_02_23
Site Map 2018_02_24
Site Map 2018_02_25
Site Map 2018_02_26
Site Map 2018_02_27
Site Map 2018_02_28
Site Map 2018_03_01
Site Map 2018_03_02
Site Map 2018_03_03
Site Map 2018_03_04
Site Map 2018_03_05
Site Map 2018_03_06
Site Map 2018_03_07
Site Map 2018_03_08
Site Map 2018_03_09
Site Map 2018_03_10
Site Map 2018_03_11
Site Map 2018_03_12
Site Map 2018_03_13
Site Map 2018_03_14
Site Map 2018_03_15
Site Map 2018_03_16
Site Map 2018_03_17
Site Map 2018_03_18
Site Map 2018_03_19
Site Map 2018_03_20
Site Map 2018_03_21
Site Map 2018_03_22
Site Map 2018_03_23
Site Map 2018_03_24
Site Map 2018_03_25
Site Map 2018_03_26
Site Map 2018_03_27
Site Map 2018_03_28
Site Map 2018_03_29
Site Map 2018_03_30
Site Map 2018_03_31
Site Map 2018_04_01
Site Map 2018_04_02
Site Map 2018_04_03
Site Map 2018_04_04
Site Map 2018_04_05
Site Map 2018_04_06
Site Map 2018_04_07
Site Map 2018_04_08
Site Map 2018_04_09
Site Map 2018_04_10
Site Map 2018_04_11
Site Map 2018_04_12
Site Map 2018_04_13
Site Map 2018_04_14
Site Map 2018_04_15
Site Map 2018_04_16
Site Map 2018_04_17
Site Map 2018_04_18
Site Map 2018_04_19
Site Map 2018_04_20
Site Map 2018_04_21
Site Map 2018_04_22
Site Map 2018_04_23
Site Map 2018_04_24
Site Map 2018_04_25
Site Map 2018_04_26
Site Map 2018_04_27
Site Map 2018_04_28
Site Map 2018_04_29
Site Map 2018_04_30
Site Map 2018_05_01
Site Map 2018_05_02
Site Map 2018_05_03
Site Map 2018_05_04
Site Map 2018_05_05
Site Map 2018_05_06
Site Map 2018_05_07
Site Map 2018_05_08
Site Map 2018_05_09
Site Map 2018_05_15
Site Map 2018_05_16
Site Map 2018_05_17
Site Map 2018_05_18
Site Map 2018_05_19
Site Map 2018_05_20
Site Map 2018_05_21
Site Map 2018_05_22
Site Map 2018_05_23
Site Map 2018_05_24
Site Map 2018_05_25
Site Map 2018_05_26
Site Map 2018_05_27
Site Map 2018_05_28
Site Map 2018_05_29
Site Map 2018_05_30
Site Map 2018_05_31
Site Map 2018_06_01
Site Map 2018_06_02
Site Map 2018_06_03
Site Map 2018_06_04
Site Map 2018_06_05
Site Map 2018_06_06
Site Map 2018_06_07
Site Map 2018_06_08
Site Map 2018_06_09
Site Map 2018_06_10
Site Map 2018_06_11
Site Map 2018_06_12
Site Map 2018_06_13
Site Map 2018_06_14
Site Map 2018_06_15
Site Map 2018_06_16
Site Map 2018_06_17
Site Map 2018_06_18
Site Map 2018_06_19
Site Map 2018_06_20
Site Map 2018_06_21
Site Map 2018_06_22
Site Map 2018_06_23
Site Map 2018_06_24
Site Map 2018_06_25
Site Map 2018_06_26
Site Map 2018_06_27
Site Map 2018_06_28
Site Map 2018_06_29
Site Map 2018_06_30
Site Map 2018_07_01
Site Map 2018_07_02
Site Map 2018_07_03
Site Map 2018_07_04
Site Map 2018_07_05
Site Map 2018_07_06
Site Map 2018_07_07
Site Map 2018_07_08
Site Map 2018_07_09
Site Map 2018_07_10
Site Map 2018_07_11
Site Map 2018_07_12
Site Map 2018_07_13
Site Map 2018_07_14
Site Map 2018_07_15
Site Map 2018_07_16
Site Map 2018_07_17
Site Map 2018_07_18
Site Map 2018_07_19
Site Map 2018_07_20
Site Map 2018_07_21
Site Map 2018_07_22
Site Map 2018_07_23
Site Map 2018_07_24
Site Map 2018_07_25
Site Map 2018_07_26
Site Map 2018_07_27
Site Map 2018_07_28
Site Map 2018_07_29
Site Map 2018_07_30
Site Map 2018_07_31
Site Map 2018_08_01
Site Map 2018_08_02
Site Map 2018_08_03
Site Map 2018_08_04
Site Map 2018_08_05
Site Map 2018_08_06
Site Map 2018_08_07
Site Map 2018_08_08
Site Map 2018_08_09
Site Map 2018_08_10
Site Map 2018_08_11
Site Map 2018_08_12
Site Map 2018_08_13
Site Map 2018_08_15
Site Map 2018_08_16
Site Map 2018_08_17
Site Map 2018_08_18
Site Map 2018_08_19
Site Map 2018_08_20
Site Map 2018_08_21
Site Map 2018_08_22
Site Map 2018_08_23
Site Map 2018_08_24
Site Map 2018_08_25
Site Map 2018_08_26
Site Map 2018_08_27
Site Map 2018_08_28
Site Map 2018_08_29
Site Map 2018_08_30
Site Map 2018_08_31
Site Map 2018_09_01
Site Map 2018_09_02
Site Map 2018_09_03
Site Map 2018_09_04
Site Map 2018_09_05
Site Map 2018_09_06
Site Map 2018_09_07
Site Map 2018_09_08
Site Map 2018_09_09
Site Map 2018_09_10
Site Map 2018_09_11
Site Map 2018_09_12
Site Map 2018_09_13
Site Map 2018_09_14
Site Map 2018_09_15
Site Map 2018_09_16
Site Map 2018_09_17
Site Map 2018_09_18
Site Map 2018_09_19
Site Map 2018_09_20
Site Map 2018_09_21
Site Map 2018_09_23
Site Map 2018_09_24
Site Map 2018_09_25
Site Map 2018_09_26
Site Map 2018_09_27
Site Map 2018_09_28
Site Map 2018_09_29
Site Map 2018_09_30
Site Map 2018_10_01
Site Map 2018_10_02
Site Map 2018_10_03
Site Map 2018_10_04
Site Map 2018_10_05
Site Map 2018_10_06
Site Map 2018_10_07
Site Map 2018_10_08
Site Map 2018_10_09
Site Map 2018_10_10
Site Map 2018_10_11
Site Map 2018_10_12
Site Map 2018_10_13
Site Map 2018_10_14
Site Map 2018_10_15
Site Map 2018_10_16
Site Map 2018_10_17
Site Map 2018_10_18
Site Map 2018_10_19
Site Map 2018_10_20
Site Map 2018_10_21
Site Map 2018_10_22
Site Map 2018_10_23
Site Map 2018_10_24
Site Map 2018_10_25
Site Map 2018_10_26
Site Map 2018_10_27
Site Map 2018_10_28
Site Map 2018_10_29
Site Map 2018_10_30
Site Map 2018_10_31
Site Map 2018_11_01
Site Map 2018_11_02
Site Map 2018_11_03
Site Map 2018_11_04
Site Map 2018_11_05
Site Map 2018_11_06
Site Map 2018_11_07