back propagation算法原理简述

back propagation - 即反向传播,因为error function是关于输出层的函数,error function对隐藏层系数求偏导涉及输出层求导,所以,本质上,反向传播算法的推导,是链式求导的推导过程。所以我们先看看链式求导(复合求导)。

假设:
h = f(u) = f(w,x)
y = g(u') = g(w',h)

那么:
dy/dw' = dg/du' * du/dw'

其中,我们假设h为隐藏层,y为输出层(简化描述,假设就1个输入层、1个隐层、1个输出层)
在整个推导过程,我们的目的是求得w、w',即网络参数。

隐藏层系数:w
输出层系数:w'

假设我们采用MSE作为loss function:
E = 1/2 *sum( (label - y)^2 )

1、输出层
输出层的输入为隐藏层h输出u',对任意输出层的输入ui'进行求导:
dE/dui' = dE/dy * dy/dui' = (y-label) * dy/dui' 记为 EI'
由于y一般为sigmoid function,y为训练过程输出值(依赖隐藏层、输入层等),label为目标值

所以:
EI' = (y-label) * y * (1-y)

对任意的输出层的系数wi' 求导,复合求导,先求y的相关系数h,然后h关于wi'求导
dE/dwi' = dE/dui' * dui'/dwi' = EI' * dui'/dwi'

由于:
u' = sum(h * w')
所以:
dE/dwi' = dE/dui' * dui'/dwi' = EI' * hi

2、隐藏层
h为隐藏层的输出,参照以上流程,对任意hi求导,u'是关于h的函数,根据复合求导规则:
dE/dhi = dE/du' * du'/dhi = EI' * wi'

可以看到隐藏的求导结果依赖了输出层的求导结果,也即,体现了反向传播的内在含义。

继续对隐藏层的任意系数求导:wi
dE/dwi = dE/dhi * dhi/dui * dui/dwi = EI' * wi' * dhi/dui * xi

dhi/dui 取决于隐藏层采用什么类型的目标函数,假设还是sigmod function,则:
dE/dwi = EI' * wi' * hi * (1-hi) * xi 记为 EI

可见,隐藏层的参数更新依赖于 输出层的EI',初始化随机撒点,得到y,根据随机梯度下降算法更新wi、wi',即可求得wi、wi'系数。

参考:arXiv:1411.2738

back propagation算法原理简述

SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number问题

最近尝试使用crf++ 进行NER训练,在mac环境下,采用brew安装

brew install crf++
出现以下错误:
SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number

解决方案:
在公司代理环境下,配置的https代理是没必要的,只需要 http代理即可,相关说明:

Uses proxy env variable httpproxy == 'https://proxy.in.tum.de:8080'
^^^^^
The https:// is wrong, it should be http://. The proxy itself should be accessed by HTTP and not HTTPS even though the target URL is HTTPS. The proxy will nevertheless properly handle HTTPS connection and keep the end-to-end encryption. See HTTP CONNECT method for details how this is done.

https://stackoverflow.com/questions/50840101/curl-35-error1408f10bssl-routinesssl3-get-recordwrong-version-number

But
mac实验,terminal中使用pip安装python程序,https proxy设置还是必要的,所以肯定是哪里设置有问题,对于https,其实可以这么设置:
https_proxy='http://proxy.in.tum.de:8080'

SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number问题

基于腾讯云的ckafka消费实践

对于KA,特别是零售商,实时流量、订单统计是主要需求。腾讯数平有各种实时计算工具可用,由于法律约束,KA数据一般不会落地到腾讯内部,那么腾讯云的ckafka即为必选方案。

kafka作为消息中间件,由linkedin发起并开源,有比较成熟的语言和api支持,同时跟hadoop生态系统也有比较好的集成。腾讯云的ckafka无缝兼容kafka,也即kafka的“云化”版本。但是ckafka使用局限于腾讯云CVM主机,无法直接访问,需要架设一个中间层,作为数据转发和适配。ckafka支持分区扩容(1~8个分区),告警管理,可以比较快速的搭建一个消息系统。

有了实时数据,还需要实时统计,可以采用spark streaming+kafka的方案,由于统计逻辑复杂,可能需要redis作为配置缓冲。当然,最终还需要mysql落地。

最近腾讯云推出 流计算服务,目前内测中,可以通过sql的方式进行实时消费,极大的降低开发成本,值得一试。

基于腾讯云的ckafka消费实践

sqoop导出,hive中空值导致的异常

先看问题:

18/09/30 10:52:44 INFO mapreduce.ExportJobBase: Exported 0 records.
18/09/30 10:52:44 ERROR mapreduce.ExportJobBase: Export job failed!
18/09/30 10:52:44 DEBUG util.ClassLoaderStack: Restoring classloader: sun.misc.Launcher$AppClassLoader@6e1567f1
18/09/30 10:52:44 ERROR tool.ExportTool: Error during export:
Export job failed!
at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:445)
at org.apache.sqoop.manager.SqlManager.exportTable(SqlManager.java:931)
at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:80)
at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:99)
at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
at org.apache.sqoop.Sqoop.main(Sqoop.java:252)

sqoop导出任务不间断出问题 ,后来发现hive中的null值在文件按\N存储,所以导致导出字符异常,参考:
https://stackoverflow.com/questions/30736049/sqoop-export-is-failing-when-i-have-n-as-data

增加选项:
--input-null-string "\\\\N" --input-null-non-string "\\\\N"


-------
感觉在不断探坑。。。
sqoop导出,hive中空值导致的异常

sqoop导出,update-key功能空指针异常问题处理

从sqoop导出mysql,涉及hdfs、hive、cos(腾讯云对象存储)等数据源,sqoop 1.4.6导出 hive表到 mysql,如果需要用到update-key功能(根据主key更新或插入),1.4.6版本实现上有bug,1.4.7版本已经解决。

只能通过hdfs、cos方式导出,注意默认hive数据分隔符是 ctrl+a,所以需要制定分隔符"\0001"

问题:
18/09/29 16:25:42 WARN hcat.SqoopHCatUtilities: No files under /usr/local/service/hive/hcatalog/lib to add to distributed cache for hcatalog job
18/09/29 16:25:42 WARN hcat.SqoopHCatUtilities: No files under /usr/local/service/hive/hcatalog/share/hcatalog/storage-handlers to add to distributed cache for hcatalog job
18/09/29 16:25:42 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException
java.lang.NullPointerException
at org.apache.sqoop.mapreduce.ExportJobBase.getFileType(ExportJobBase.java:127)
at org.apache.sqoop.mapreduce.ExportJobBase.isSequenceFiles(ExportJobBase.java:118)
at org.apache.sqoop.mapreduce.ExportJobBase.inputIsSequenceFiles(ExportJobBase.java:492)
at org.apache.sqoop.mapreduce.JdbcUpdateExportJob.getMapperClass(JdbcUpdateExportJob.java:69)
at org.apache.sqoop.mapreduce.ExportJobBase.configureMapper(ExportJobBase.java:268)
at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:426)
at org.apache.sqoop.manager.MySQLManager.upsertTable(MySQLManager.java:136)
at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:74)
at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:100)
at org.apache.sqoop.Sqoop.run(Sqoop.java:143)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)
at org.apache.sqoop.Sqoop.main(Sqoop.java:236)

解决方案:

sqoop export --connect jdbc:mysql://ip:port/db --table table_name
--username xxx --password xxx
--export-dir hdfs路径or cos路径
--update-key mysql-table-primary-key --update-mode allowinsert
--input-fields-terminated-by "\0001"

sqoop导出,update-key功能空指针异常问题处理