静态图 VS 动态图

现在的深度学习平台在定义模型的时候主要用两种方式:static computation graph(静态图模型) 和 dynamic computation graph(动态图模型)

静态图:TensorFlow, Theano, Caffe,Keras等。
动态图:PyTorch, Chainer, Dynet,TensorFlow Fold

部署:静态。为什么?

imperative mode做control flow,很多框架其实并不是自己做control flow,而是利用python来做,框架自己只记录一个static graph。这样的缺点是你没法部署到真正核心的产品里面,一旦要部署,就必须回到static graph去 - 很多产品,比如大规模推荐系统和移动端,是不可能用python的,overhead太大。

pytorch更容易重构函数,但是如果需要部署的话就还是得像TF或者其他一些框架一样老老实实做dirty work。

其实是抽象程度和可控程度之间的balance,

控制流真的在产品中很关键吗?因为控制流会影响整个内存的预测和建图,对性能还是有伤害的吧?真的需要性能直接通过C++接口的话会不会overhead可以接受一点?
答:的确对于性能会有影响。比如说在手机端C2的策略是完全不用dispatcher和动态内存,一切都静态分配。不过在比较复杂的网络情况下,真要控制流的话还是需要有一定tradeoff的。
另外实际应用中的确控制流用到的不多。

作者:贾扬清
链接:https://www.zhihu.com/question/63342728/answer/208898814
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

静态图定义的缺陷是在处理数据前必须定义好完整的一套模型,能够处理所有的边际情况。比如在声明模型前必须知道整个数据中句子的最大长度。相反动态图模型(现有的平台比如PyTorch, Chainer, Dynet)能够非常自由的定义模型。举个例子,传统的LSTM往往处理一个句子的时候都是以word为单位,然后利用word2vec来初始化词向量。但是往往有一些很奇怪的词在vocabulary里是找不到的,也就是没法用word2vec初始化词向量。这时候你可能想用characer-level(字符)级别的表示来初始化那个单词,就需要借助动态图模型的定义了。简单来说动态图模型允许你在运行程序的时候动态去修正你的模型结构,来处理各种奇奇怪怪的边角输入,这在学术研究的时候的灵活性就体现出来了。

静态图需要在处理数据前定义好一套完整的模型;而动态图模型允许用户先定义好一套基本的框架再根据数据来实时修正模型。

能不能用指针形容一下动态和静态实现的区别?

tensorflow中的动态图

dynamic_rnn

dynamic-rnn可以允许不同batch的sequence length不同。
是否允许同一个batch内的sequence length不同?

  • 是动态图实现的?还是模拟的动态图?
  • dynamic-rnn到达sequence length之后终止计算吗?
    • 超出序列长度 seq_len,就复制 zero output 和之前的 state 到下一个时间步。避免了padding污染
  • 能batch training吗?
  • 跟普通rnn比较,会变慢吗?还是更快?
  • 推荐用普通rnn还是动态rnn?

为了得到没有padding污染的hidden state(LSTM,GRU会倾向于记住更多后面的信息,padding会对前向RNN的final state产生负面影响),需要传入sequence被pad前的长度;而为了加快计算速度,还是需要对整个数据集根据长度做bucketing。

https://www.zhihu.com/question/52200883/answer/208377796

Is padding necessary for LSTM network?

理解深度学习,机器学习,学到的是什么?人工智能可怕吗?

深度学习学的是什么?目前人工智能做到的是什么?

  • 自然语言理解,下棋,自动驾驶,人脸识别,等任务,机器是真的理解了吗?机器学到了什么?
  • 机器学到的只不过是套路?只不过是对对子的升级版?类似天王盖地虎,对出宝塔镇河妖。
    • 套路就是规律,是统计特性,是概率分布。
    • CNN学到的不同层面的特征,
  • 怎样才算机器理解了?
    • 机器学到的套路,算不算理解了?学到的
  • 人是怎样理解的?

    • 人的理解也无非是总结的套路/规律
  • 人的学习和机器学习的区别是什么呢?

  • 人和机器的区别是什么?情感?幽默?创新?饿?疼痛?生老病死?

    • 人:这些无非是上帝在制造人的时候赋予的奖惩点,让人趋利避害,从而生存,最大化奖励。
    • 机器:人的这些机器也可以有,只不过机器的奖惩点不同。机器
  • 星球大战,终结者,理论上可行吗?
    • 可行吧
  • 不要以提到人工智能,就想着机器人。
    • 一个程序,繁殖是奖励,被kill掉是惩罚。让他在模拟环境中自生自灭。同时模拟一些killer,强化学习,自我增强。道高一尺,魔高一丈。

-

人工智能什么水平

  • 弱人工智能,擅长单个领域
  • 强人工智能,各方面与人类比肩。。。 这条路很难走
  • 超人工智能,超过所有领域最聪明的人类

强人工智能实现的瓶颈是什么

  • 算力,量子计算发展中 & 云计算

终结者的瓶颈是什么?

  • 能源,电影里的机器人一般都伴随能量球、能量棒、超级能量。很有道理的。如果能云充电、太阳能充电等方式,那就更无敌了。

#

https://www.zhihu.com/question/27864852

语音方面的人工智能创业公司

  • 思必驰
    • 原阿里iDST语音团队负责人初敏加入思必驰,任北京研发院院长 (中科院声学所->微软->阿里)
    • 语音识别、语音合成、自然语言理解、智能交互决策、声纹识别、性别及年龄识别、情绪识别等
    • 其语音识别、声纹识别、口语对话系统等技术曾经多次在美国国家标准局、美国国防部、国际研究机构评测中夺得冠军
  • 云知声
  • 腾讯AI Lab
    • 副主任俞栋

他们还是非常偏重云端的。地平线的语音则一开始就强调云端+嵌入式

面临的挑战

  • 效率
  • 嘈杂环境 - 鸡尾酒会问题
    • 把手机拿远一点,Siri就gg了。这里主要的原因是人说话的语音信号与手机麦克风所采拾的环境噪声之间信噪比(SNR)较小,噪声影响了正常识别系统的性能,这里的噪声包括环境的背景音,以及声音的混响(reverberation)。
    • 在嘈杂环境下(SNR较小),噪声种类千变万化,导致每种音素的分布在各个方向偏移较大,数据分布变得复杂,使得需要更复杂的分类器,甚至也不一定能区分
    • 解决方法:
      • 前端:使用麦克风阵列采集多个信源的信号,综合分析出噪声和语音;传统的DSP方法对语音信号进行消除噪音处理。另外也有一些信号分离语音增强信号降噪的方法可以做。消噪处理有 降混响,回声消除,声源定位后接馅零处理,基于统计的单麦克风噪声消除,麦克风阵列处理。
      • 平稳的噪声结合基于统计的单麦克风和VAD就很好解决掉,跟人声频谱相叠加的噪音就会很麻烦,麦克风阵列的声源定位和馅零可以解决掉空间上的噪音来源,而对于有参考信号的噪音来源,可以使用回声消除算法消除。
      • GAN
  • 特定场景
  • 语言理解
    • 现在市面上不管哪个语音助手聊天机器人,你跟它聊几分钟你就知道它有多傻了,离真正的理解、对话、交互还差得远,这里有很多事情要做。 — 初敏
  • 系统鲁棒性
    • 数据没覆盖的情况就做不好,
    • 自适应算法

参考

WaveNet

Tacotron
Tacotron 2 (包括一个循环序列到序列特征预测网络和一个改良的 WaveNet 模型)paper

牛建伟:我们现在已有的是一个相对来说比较主流的技术框架。文本处理前端就是利用 NLP 相关算法、资源进行文本的规整,提取词法和语法信息。后端主要集中在参数合成,这一环节比较容易放到嵌入式的端上面进行,因为它的资源量比较小。这样的话 TTS 系统只需要占用几十 MB 的空间,对计算的要求也可控。后端我们用的就是一个相对主流的 BLSTM 模型,这基本上也是各家都在用的。

至于 WaveNet,它相对来说提高了合成语音的自然度,还有舒适度,但是它存在一个问题就是计算量很大。语音是 16K 采样,一秒钟它就要预测 16000 次。当然可以再做加速,但现在加速的效果还没有那么好,现在基本上还是 100 倍的实时率,就是合成一秒钟语音还需要 100 多秒的计算时间。这没办法直接用到产品上面,所以我们还是在追踪 WaveNet 的阶段。

可视化语音分析:深度对比Wavenet、t-SNE和PCA等算法

Gated CNN 跟 9 月份的 WaveNet 其实有点类似,因为它相当于是把显示的那种循环结构改了一下。

讯飞出现的错误

java端未说话,则出现以下错误:

错误原因:您好像没有说话哦.
at com.iflytek.cloud.b.c.a.do(Unknown Source)
at com.iflytek.cloud.b.c.a.f(Unknown Source)
at com.iflytek.cloud.b.c.a.i(Unknown Source)
at com.iflytek.cloud.b.c.a.char(Unknown Source)
at com.iflytek.cloud.b.e.a$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)

windows下没有msc32.dll,或者linux下没有加载.so文件,则会出现以下错误:

Exception in thread “Thread-670” java.lang.UnsatisfiedLinkError:
.MSC.QISRSessionBegin([B[BLcom/iflytek/msc/MSCSessionInfo;)[C
at com.iflytek.msc.MSC.QISRSessionBegin(Native Method)
at com.iflytek.cloud.b.c.c.a(Unknown Source)
Xunfei: no speak

python端未启动

java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)

java中设置的端口号,必须要与python端设置的端口号一致!!!

端口占用

  1. kill 掉占用进程: lsof -i|23333
  2. socket.shutdown然后socket.close
  3. 允许端口复用
  4. 程序只能等到下一个连接到来时,才能关闭线程。 (解决办法,加入监听等待超时)
    socket.setdefaulttimeout(timeout)
    这样默认20秒之后就会超时。
    5.

教程 http://bbs.chinaunix.net/thread-4083249-1-1.html

say重复多次

os.system(‘java -jar /var/persistent/home/nao/java/xf_lib/xunfeiutf.jar’)

  1. choregraphe中运行python, 该句在terminal中执行, ok
  2. 直接加入python脚本,运行 python comm_server.py ok
  3. 加入choregraphe中,运行 not ok

t=os.system(‘/var/persistent/home/nao/java/xf_lib/run_jar.sh’) # 调用python脚本或jar包都返回512, 其他返回0
t=os.system(‘echo fdfd>>/var/persistent/home/nao/java/xf_lib/test1.txt’) # 返回0
t=os.system(‘java -jar /var/persistent/home/nao/java/xf_lib/xunfeiutf.jar’) # 返回32512

原因: choregraphe中不识别系统Path变量,因此不识别java,可以加入java的全路径,如下:
os.system(‘/var/persistent/home/nao/java/jre1.7.0_79/bin/java -jar /var/persistent/home/nao/java/xf_lib/xunfeiutf.jar’)

卡在java -jar /var/persistent/home/nao/java/xf_lib/xunfeiutf.jar

原因:
也许都集成在nao-bin程序中,调用的jar也集成,并非进程间通信。

解决办法:
测试通过方式3,调用jar,写一个文件,看是否输出

替代做法:

  1. python 调用jar,不采用进程间通信
  2. python直接调用c包(无音频前后端点检测)
  3. 采用多进程,新建一个进程,

编码问题

文件编码:
在eclipse中,

terminal显示编码:

要求是utf-8编码显示
sys.getdefaultencoding() 显示的是ascii

xunfeiwriternosocket.jar 在windows上写出来是好的,在小森上是乱码
考虑采用utf-8编码之后,再写文件

xunfei.jar python接收信号,并写出,是乱码
xunfeiutf.jar python接收信号,并写出,是乱码

讯飞应用到nao中的几种方式:

  • python直接调用c包(无音频前后端点检测,放弃)
  • python与jar包进程间通信 (我们目前采用的是该方法)
  • python 调用jar,不采用进程间通信(可行)

讯飞限制

  • 讯飞账号信息,需要绑定微信手机账号
  • 申请认证,
  • 多个appid,代码更新,需要多个appid单独编译并打包, 比较繁琐
  • 支持简单英文(中英文混杂场景),不支持纯英文场景