Thursday, August 29, 2019

AI 從頭學(五):AD and Python

AI 從頭學(五):AD and Python

2016/12/16

-----


Fig. Python(圖片來源:Pixabay)。

-----

昨天花了一整天,不看任何參考資料,直接在白紙上用 python 且不用任何可自動微分的套件 來寫 LeNet,寫出來的 code 直接輸入電腦後可以訓練且跑出應有的結果.....

以上是《艾莉的異想世界》本集內容。

其實昨天上台北跟老闆開了一天的會,回家後還加班到一點.....

-----

引用臉書資料:

Mar ang :

Mar ang :

Mar ang :

-----

原來出手指點的是神影,真正的神人還遠在天邊!

星期三當天回家就把之前查的一些 CNN papers 翻出來再看一遍。以 LeNet-5 為實例去瞭解 CNN,的確又更清楚一點點。

我決定動手試試。然而,依照神影的建議,LeNet 之前要會 AD,而且還是手動 AD,不是依賴套件。問題是 Python 的書我雖然不少了,可是還沒真正寫過,所以只好再查一下資料。

原來的方向似乎不大對 [1]-[4],新的的可能有機會 [5]-[12]。 

-----

出版說明:

2019/08/29

建議者的建議,未必適合所有的人。

主要是,實作 LeNet,不一定要實作 AD。

這邊研究了一下如何用 Python 實作 AD,但還是卡了一陣子,最後也沒實作。總之,方向繼續調整。

-----

References

[1] 2016_Benchmarking Python Tools for Automatic Differentiation

[2] 2014_Automatic differentiation of algorithms for machine learning

[3] 2012_CasADi, A Symbolic Package for Automatic Differentiation and Optimal Control

[4] 2012_Algorithmic Differentiation in Python with AlgoPy

[5] 2016_Introduction to Scientific Computing in Python

[6] 2015_Mastering Python Scientific Computing

[7] 2015_Introduction to Python for Computational Science and Engineering

[8] 2014_An introduction to Python for scientific computing

[9] 2014_A Primer on Scientific Programming with Python

[10] 2012_A Primer on Scientific Programming with Python

[11] 2011_A Primer on Scientific Programming with Python

[12] 2009_A Primer on Scientific Programming with Python

Tuesday, August 27, 2019

AI 從頭學(四):AD and LeNet

AI 從頭學(四):AD and LeNet

2016/12/14

-----


Fig. The Net(圖片來源:Pixabay)。

-----

博二的一年,每週都到台大跟老闆的老闆的學生以及老闆的老闆的學生的學生 seminar,是不是有點繞口令:)聽他們報告閒聊,年輕人的聰明才智全寫在臉上了。

 我忍不住想酸一下台大人!講這麼白,豈不是說,你們這些外行人少來沾醬油了!話雖然鋒利,卻也直指核心。我們參加社團,難道不是因為有顆上進的心?有高手好意指點,還不虛心受教,趕緊做功課嗎?

搞完這一篇,今天也沒力查論文了!:P

-----

引用臉書資料:

Mar ang : 

Jason Tsai :AD 還自己搞太累啦了 :-) 我去年本來要用 Haskell 建 DL 模型,但是 libraries 生態不夠完整,很多底層的東西都要修修補補,我就暫時擱置了。

Mar ang :

Jason Tsai :還有什麼東西是現有各語言的數值計算 automatic differentiation package 缺乏的?與其自己從零造螺絲,幫忙改進現有的 open source libraries 也是可以學到不少並造福社群。

-----

出版說明:

2019/08/27

有高手來指導是幸福的,雖然指導的內容不一定是你需要的。

這裡面,AD 跟 Haskell 是誤區,LeNet 是正解。Haskell 很容易就可以忽略,不過我在 AD 繞了一段。不是說 AD 不重要,而是 LeNet 必須要先瞭解。AD 可以排在 LeNet 最後用 Python 實作的時候,再徹底掌握就可以了!

無論如何,我知道 LeNet 了!

-----

References

◎ AD

[1] 自動微分
https://zh.wikipedia.org/wiki/%E8%87%AA%E5%8B%95%E5%BE%AE%E5%88%86

[2] Automatic Differentiation
https://en.wikipedia.org/wiki/Automatic_differentiation

[3] 2016_Mathematical modeling and optimization of complex structures

[4] 2012_Recent advances in algorithmic differentiation

[5] 2010_Introduction to Automatic Differentiation and MATLAB Object-Oriented Programming

[6] 2008_Advances in automatic differentiation

[7] 2006_Automatic Differentiation, Applications, Theory, and Implementations

[8] 1992_Automatic Differentiation, Overview and Application to Systems of  Parameterized Nonlinear Equations

[9] 1981_Automatic Differentiation, Techniques and Applications

-----

◎ LeNet

[10] LeNet-5 is a latest convolutional network designed for handwritten and machine-printed character recognition. 
http://yann.lecun.com/exdb/lenet/ 

[11] 1998_Gradient-Based Learning Applied to Document Recognition

[12] Deep Learning(深度学习)学习笔记整理系列之LeNet-5卷积参数个人理解
http://blog.csdn.net/qiaofangjie/article/details/16826849

[13] LeNet CNN 實例: MNIST 手寫數字辨識
https://allenlu2007.wordpress.com/2015/11/28/mnist-database-%E6%89%8B%E5%AF%AB%E6%95%B8%E5%AD%97%E8%BE%A8%E8%AD%98/

[14] LeNet - Convolutional Neural Network in Python - PyImageSearch
http://www.pyimagesearch.com/2016/08/01/lenet-convolutional-neural-network-in-python/ 

-----

◎ Haskell

[15] Haskell (programming language) - Wikipedia
https://en.wikipedia.org/wiki/Haskell_%28programming_language%29

[16] Haskell - 維基百科,自由的百科全書
https://zh.wikipedia.org/wiki/Haskell

[17] 2015_Developing Web Applications with Haskell and Yesod

[18] 2014_Haskell Data Analysis Cookbook

[19] 2014_Beginning Haskell, A Project-Based Approach

[20] 2013_Parallel and Concurrent Programming in Haskell Techniques for Multicore and Multithreaded Programming

[21] 2013_Haskell Financial Data Modeling and Predictive Analytics

[22] 2012_Developing Web Applications with Haskell and Yesod

[23] 2011_Learn You a Haskell for Great Good A Beginner's Guide

[24] 2008_Real World Haskell

Friday, August 23, 2019

AI 從頭學(三):Popular Deep Learning Hardware Tools

AI 從頭學(三):Popular Deep Learning Hardware Tools

2016/12/08

-----


Fig. GPU(圖片來源:Pixabay)。

-----

References

# DGX-1

[1]「Nvidia發布超級計算機DGX-1 售價超80萬元- 今日頭條 big5.jinri-toutiao.com/id/337559.html 2016年4月7日 - 它配備了7TB固態硬盤,8塊Tesla P100顯卡和2塊英特爾Xeon處理器——如此的配置也給起帶來了超高的處理性能(170萬億次浮點運算/秒), ...」
http://big5.jinri-toutiao.com/id/337559.html

[2]「NVIDIA在今年的GTC大會上推出了包括GPU晶片Tesla P100(基於全新Pascal平台架構上打造)、DRIVE PX2(用於自動駕駛汽車的開發平台)和用於深度學習研究的超級計算機DGX-1(使用Tesla P100晶片建造,運算速度可達170萬億次)在內的一系列新技術和新產品。」
https://read01.com/dxj7Le.html

-----

# M40

[3]「如果只有深度學習的訓練,NVIDIA 的 Tesla M40/M4 雖然不便宜,但企業或者機構購買還是比較合適的(百度的深度學習研究院就用的這一款),相對於 K40 單精度浮點運算性能是 4.29T flops,M40 可以達到 7T flops。」
https://read01.com/dxj7Le.html

-----

# Titan X

[4] 「NVIDIA 新一代卡王,US$1,200 一張的Titan X 現身 - Engadget 中文版 chinese.engadget.com/2016/.../nvidias-new-top-end-graphics-card-is-the-1-200-titan-... 2016年7月22日 - 如果你剛買了張 NVIDIA GTX 1080,正在享受擁有地表最快的桌機遊戲顯卡的快感的話,那... 壞消息告訴你,GTX 1080 已經被新一代的 Titan X 踢到 ...」
http://chinese.engadget.com/2016/07/22/nvidias-new-top-end-graphics-card-is-the-1-200-titan-x/

-----

# 1070

[5]「最強顯示卡現身! NVIDIA 推出 GTX 1080、GTX 1070 | 自由電子報 3C 科技 3c.ltn.com.tw/news/24282 2016年5月7日 - NVIDIA 終於正式推出了新一代顯示卡王者 GTX 1080、GTX 1070,作為取代目前 GTX 980 和 GTX 970 的產品。這兩張顯示卡採用 Pascal 架構, ...」
http://3c.ltn.com.tw/news/24282

-----

# VGG16

[6]「關於圖像語義分割的總結和感悟- IT閱讀 www.itread01.com/articles/1476698476.html 2016年10月17日 - 卷積化即是將普通的分類網絡,比如VGG16,ResNet50/101 等網絡丟棄全連接層,換上對應的卷積層即可。如下圖: 這裏寫圖片描述 ...」
http://www.itread01.com/articles/1476698476.html

跑步(二一四):20 圈

跑步(二一四):20 圈

2019/08/22

熱身2,跑(5*4)。

-----

累。

Thursday, August 15, 2019

Leslie Cheung Kwok Wing

Leslie Cheung Kwok Wing

2019/08/15

-----


-----

0304

-----

References

[1] 張國榮 - 維基百科,自由的百科全書
https://zh.wikipedia.org/wiki/%E5%BC%B5%E5%9C%8B%E6%A6%AE

[2] 張國榮死亡之謎!那一天真的很詭異... LIFE生活網
https://life.tw/?app=view&no=251676

AI 從頭學(二):Popular Deep Learning Software Tools

AI 從頭學(二):Popular Deep Learning Software Tools

2016/12/08

-----


Fig. Framework(圖片來源:Pixabay)。

-----

下面四種是有支援 OpenCL 的:

1. Caffe
2. Torch
3. Theano
4. DeepCL

下面四種是 Python 可用的 machine learning library 前四名 :

1. Scikit-learn
2. TensorFlow
3. Theano
4. Caffe

-----

‧Caffe, developed by the Berkeley Vision and Learning Center, has unofficial support for OpenCL under the name project GreenTea [2]. There is also an AMD version of Caffe that supports OpenCL [1].

‧Torch, a scientific computing framework written in Lua, is widely used and has unofficial support for OpenCL under the project CLTorch [6].

‧Theano, developed by the University of Montreal, has unofficial support for OpenCL under the work-in-progress gpuarray backend [5].

‧DeepCL is an OpenCL library to train deep convolutional neural networks, developed by Hugh Perkins [3].

-----

出版說明:

2019/08/15

Framework 基本上是分類的 libraries。簡單說就是先寫好一堆 APIs 讓你 call。白話說,就是不用重頭造輪子。 早在很久以前 Visual C++ 推出後,微軟就推出了 MFC,不過 MFC 是給 Windows 程式用,不是給深度學習用。

2020 年如果你要進入深度學習,主要就是 TensorFlow(Keras)跟 PyTorch 兩個選擇。TensorFlow 功能強大但被認為有點混亂,Keras 把 TensorFlow 包的很好用。PyTorch 的代碼很漂亮,我看到後就立刻愛上了,後來還成立了 PyTorch Taiwan 的 FB 社團。

下方則是兩年半前,我剛接觸深度學習時,蒐集到的資料。目前 Theano 已經退出舞台了,不過它的精神留在後續其他的深度學習框架中。 老兵不死,只是凋零。

-----

資料來源:

Lacey, Griffin, Graham W. Taylor, and Shawki Areibi. "Deep Learning on FPGAs: Past, Present, and Future." arXiv preprint arXiv:1602.04283 (2016).

References

[1] Caffe-OpenCL.
https://github.com/amd/OpenCL-caffe/wiki, 2015.

[2] Caffe: project greentea.
https://github.com/BVLC/caffe/pull/2195, 2015.

[3] DeepCL.
https://github.com/hughperkins/DeepCL, 2015.

[5] Theano: gpuarray backend.
http://deeplearning.net/software/libgpuarray/index.html, 2015.

[6] Torch: cltorch.
https://github.com/hughperkins/cltorch, 2015.

-----

Table 1: Overview of Deep Learning Frameworks with OpenCL Support

Tool / Core Language / Bindings / OpenCL / User Base
Caffe / C++ / Python, MATLAB / Partial Support / Large
Torch / Lua / - / Partial Support / Large
Theano / Python / - / Minimal Support / Large
DeepCL / C++ / Python, Lua /Full Support / Moderate

-----

Top 20 Python Machine Learning Open Source Projects, 2016 ...

https://www.linkedin.com/pulse/top-20-python-machine-learning-open-source-projects-2016-prasad-pore?articleId=8126016610130529727 

前四名比較常見。 

1. Scikit-learn
2. TensorFlow
3. Theano
4. Caffe

Wednesday, August 14, 2019

AI 從頭學(一):文獻回顧

AI 從頭學(一):文獻回顧

2016/12/08

-----


Fig. Literature(圖片來源:Pixabay)。

-----

出版說明:

2019/08/14

最初要切進深度學習這個新領域時,依照學術慣例,先用 deep learning、review、survey,這幾個關鍵字,在 Google Scholar 找了幾篇論文,並且讀了其中幾篇,開始發表心得。

以 2015《Deep Learning》這篇為例,當初整篇看過一次,知道 Deep Learning 可以做什麼,但還是不知道 Deep Learning 要如何做。其實重要的幾篇,論文的參考文獻都有標示出來,最重要的 LeNet 也在其中。

總之,因為我持續在網路上發表心得,就有人告訴我從 LeNet 開始。這就是發表心得的好處,提供給讀者參考。

-----

References

[1] Lacey, Griffin, Graham W. Taylor, and Shawki Areibi. "Deep Learning on FPGAs: Past, Present, and Future." arXiv preprint arXiv:1602.04283 (2016).

[2] Wang, Hao, and Dit-Yan Yeung. "Towards Bayesian Deep Learning: A Survey." arXiv preprint arXiv:1604.01662 (2016).

[3] Schmidhuber, Jürgen. "Deep learning in neural networks: An overview." Neural Networks 61 (2015): 85-117.

[4] LeCun, Yann, Yoshua Bengio, and Geoffrey Hinton. "Deep learning." Nature 521.7553 (2015): 436-444.

[5] Yu, Dong, Li Deng, and D. Yu. "Deep Learning Methods and Applications." Foundations and Trends in Signal Processing (2014).

[6] Bengio, Yoshua, Aaron C. Courville, and Pascal Vincent. "Unsupervised feature learning and deep learning: A review and new perspectives." CoRR, abs/1206.5538 1 (2012).

[7] Bengio, Yoshua. "Learning deep architectures for AI." Foundations and trends® in Machine Learning 2.1 (2009): 1-127.

Monday, August 05, 2019

MacLehose Trail

MacLehose Trail

2019/07/04

北潭涌

浪茄

-----


// 山中四日──全走麥理浩徑紀行   論盡媒體 AllAboutMacau Media

-----

北潭凹

企嶺下

大老山

大埔公路

城門

鉛礦坳

荃錦公路

田夫仔

屯門

-----

References

[1] MacLehose Trail - Wikipedia
https://en.wikipedia.org/wiki/MacLehose_Trail

[2] 麥理浩徑 - 維基百科,自由的百科全書
https://zh.wikipedia.org/wiki/%E9%BA%A5%E7%90%86%E6%B5%A9%E5%BE%91

[3] mmap
http://hiking.gov.hk/eng/pdf/longtrail/mtrail/mmap.pdf

[4] [麥理浩徑100K縱走殘念記] 遲來的27歲生日感謝文 _ 高郁函 _ Fitz • Get Moving
https://fitz.hk/sports/hiking/%E9%BA%A5%E7%90%86%E6%B5%A9%E5%BE%91100k%E7%B8%B1%E8%B5%B0%E6%AE%98%E5%BF%B5%E8%A8%98-%E9%81%B2%E4%BE%86%E7%9A%8427%E6%AD%B2%E7%94%9F%E6%97%A5%E6%84%9F%E8%AC%9D%E6%96%87/

[5] 山中四日──全走麥理浩徑紀行   論盡媒體 AllAboutMacau Media
https://aamacau.com/2015/08/04/%E5%B1%B1%E4%B8%AD%E5%9B%9B%E6%97%A5%E5%85%A8%E8%B5%B0%E9%BA%A5%E7%90%86%E6%B5%A9%E5%BE%91%E7%B4%80%E8%A1%8C/

[6] 麥理浩徑四天順行記 - 黃牛山人
https://bchai.cc/2019/02/08/maclehose-trail-4days/

[7] 薄樂閣  全麥一包
http://boolehgee.blogspot.com/2015/01/3095100-40-1001500-100-1501160944-1042.html

[8] 2017.04.14-17 七十八小時跑營 復活節四日三夜 麥理浩徑全走
http://ouruniquelegacy.blogspot.com/2017/04/20170414-17.html

[9] 2018.03.30-2018.04.01 復活節 五十五小時 三日兩夜 麥理浩徑全走跑營 🎉
http://ouruniquelegacy.blogspot.com/2018/04/20180330-20180401.html

浪茄

浪茄(Long Ke)

2019/07/25

「浪茄 聖母聖誕小堂 //浪茄位於東面出海口之旁,前臨浪茄灣。1866年,意大利傳教士獲朗他尼所繪的《新安縣全圖》,則標作同音的「龍腳」(Long Ket)。龍腳與浪茄,為陸居人與水上人方音不同所引起的差異。// 節錄自:《香港的地名與地方歷史 (下):新界》作者:饒玖才 獲朗他尼=和神父 (安西滿主教) Rev. VOLONTERI, Simeone MEM (1831-1904)」[3]。

「龍腳之名原來與風水有關」。[5]。

-----

References

[1] Long Ke Wan - Wikipedia
https://en.wikipedia.org/wiki/Long_Ke_Wan

[2] 浪茄 - 維基百科,自由的百科全書
https://zh.wikipedia.org/wiki/%E6%B5%AA%E8%8C%84

[3] (8) 古道行—再踏先賢路 永續傳教心 - 貼文
https://www.facebook.com/followingthyway/posts/2314487172096957

[4] 有 趣 地 名
http://www.henrilaw.com/travel/placename/place_1/framefornames.htm

[5] 一生得意1372  罾棚角、千柱海岸 20160501
http://lindaylchan.blogspot.com/2016/05/20160501.html

九龍坑山

九龍坑山(Cloudy Hill)

2019/07/25

「九龍坑山舊稱合雲山,因村民常見山與雲彼此相合,故有此名。龍坑即山溪之義,九龍坑即龍坑九條,此九條山溪下之客家村落,就叫九龍坑村。」[3]。

-----

References

[1] Cloudy Hill - Wikipedia
https://en.wikipedia.org/wiki/Cloudy_Hill

[2] 九龍坑山 - 維基百科,自由的百科全書
https://zh.wikipedia.org/wiki/%E4%B9%9D%E9%BE%8D%E5%9D%91%E5%B1%B1

[3] 環山碧水九龍坑 -- LifeStyle Journal 優雅生活
http://lj.hkej.com/lj2017/travelsports/article/id/941070/%E7%92%B0%E5%B1%B1%E7%A2%A7%E6%B0%B4%E4%B9%9D%E9%BE%8D%E5%9D%91

Pak Tam Chung

Pak Tam Chung

2019/08/05

「北潭涌原指龍坑,是流經北潭的一條溪澗。」[2]。「北潭涌響正兩條涌匯合之處,其中大嗰條叫龍坑,係北潭流入來,直流入海。因為呢條涌,所以呢度叫北潭涌。」[3]。

「涌(音同「沖」),又叫河涌,是指江河在入海口的河汊。河涌是鹹淡水交界,水流受到潮汐影響,潮漲時,海水倒灌入涌;潮退後,河水經河涌流進海,一般的水流很少,有時會乾涸。 在廣州、深圳、東莞、香港一帶,許多地名都叫「涌」;部分地名異化為「沖」,例如廣州的上沖、羅沖圍。 」[4]。「龍坑即山溪之義。」[5]。

「用北潭命名的地方有三個:一,北潭涌,最熱鬧;二,北潭村,簡稱北潭,乃深藏山村;三,即北潭坳村(在登牛耳石山時於山腰處回望可見),林後有村屋,頗美;通常為進入極東區的起步點。」[6]。

「穿過龍坑,沿坑畔水管路往北潭村,該村已改建成戒毒所,也有很多惡犬在菜園裡駐守,每次在旁邊經過時,牠們都瘋狂的吠叫,如牠們沒被鎖著,相信必有很多人遭殃。」[7]。

「花潭石澗,地名龍坑,上源花苗山(畫眉山),下源北潭澗道平緩悠長,流至北潭涌一段為小亞馬遜;以花潭石澗為首,加上牛耳石坑、雷花石澗、畫眉坑及蛇地坑,稱為花潭五澗,但均屬中小之澗。」[8]。

「花潭石澗,土名龍坑,為花潭五澗之首,其餘分別為「牛耳石坑」、「雷花石澗」、「畫眉石澗」與「蛇地坑」。此澗源流甚長,遊區通常分作三部份,下游處河水繞帶,是稱小亞馬遜,中游為北潭村對開之平順澗道,上游為三澗分位,到花潭者多以此作起步點,其內有飛流串迎,其中一瀑匿藏於疾轉九十度的河谷內,其勢來得極其突然,每有嚇唬旅者之效,故行友稱曰「隱瀑」,瀑上不遠有水坑如槽,人需涉水而入,由此經過兩個峻瀑後,便須向右方攀上「麥里浩徑」到「嶂上」平原了。」[9]。

「去龍坑要經北潭村,可以係鯽魚湖行入去,亦可以係麥理浩夫人渡假村行入去。」[8]。

北潭,鯽魚湖?

-----

早在嘉慶年間,北潭村村名已存在: 

「1819年,嘉慶《新安縣志》〈輿地略〉,列出胲年代通內的鄉村包括: 官富司管屬(即廣府籍)村莊:蠔涌村、北港忖、沙角尾、大網仔、北潭村、榕樹澳、樟上、大浪村、滘塘(即高塘)和赤徑(首四村均位於小盆地內,耕地較多,後發展為村落眾多的地區)。 官富司管屬客籍村莊:沙角尾、大網仔、早禾坑、爛泥灣。 不過,在同卷的墟市名單中,並無西貢之名。」[11]。

-----

References

[1] Pak Tam Chung - Wikipedia
https://en.wikipedia.org/wiki/Pak_Tam_Chung

[2] 北潭涌 - 維基百科,自由的百科全書
https://zh.wikipedia.org/wiki/%E5%8C%97%E6%BD%AD%E6%B6%8C

[3] 北潭涌 - 維基百科,自由嘅百科全書
https://zh-yue.wikipedia.org/wiki/%E5%8C%97%E6%BD%AD%E6%B6%8C

[4] 涌 - 維基百科,自由的百科全書
https://zh.wikipedia.org/wiki/%E6%B6%8C

[5] 環山碧水九龍坑 -- LifeStyle Journal 優雅生活
http://lj.hkej.com/lj2017/travelsports/article/id/941070/%E7%92%B0%E5%B1%B1%E7%A2%A7%E6%B0%B4%E4%B9%9D%E9%BE%8D%E5%9D%91

[6] 用北潭命名的地方有三個
https://books.google.com.tw/books?id=3SCyBQAAQBAJ&pg=PA53&lpg=PA53&dq=%E7%94%A8%E5%8C%97%E6%BD%AD%E5%91%BD%E5%90%8D%E7%9A%84%E5%9C%B0%E6%96%B9%E6%9C%89%E4%B8%89%E5%80%8B&source=bl&ots=_cwl2dyIrh&sig=ACfU3U0xL8zMqk-WCJ_eaWKESY8k9xYgMA&hl=zh-TW&sa=X&ved=2ahUKEwjO7ZKikevjAhVCFqYKHXOsDRMQ6AEwAHoECAkQAQ#v=onepage&q=%E7%94%A8%E5%8C%97%E6%BD%AD%E5%91%BD%E5%90%8D%E7%9A%84%E5%9C%B0%E6%96%B9%E6%9C%89%E4%B8%89%E5%80%8B&f=false

[7] 北潭坳  近觀北潭石之旅
http://paktamau.blogspot.com/2015/05/blog-post_20.html

[8] 越野雄心--花潭石澗(龍坑)
http://www.wildconqueror.com/web/outdoor801/LungHang.htm

[9] 香港山澗叢集
http://www.hkfca.org.hk/stream/dra21.htm

[10] Michael:北潭涌的原居民 _ Urban Diary 城市日記 _ 香港獨立媒體網
https://www.inmediahk.net/20140320 

[11] 为什么香港有个地方叫西贡? - 知乎
https://www.zhihu.com/question/277953409