1. 程式人生 > >當我們在談論機器學習時我們到底在談些什麼

當我們在談論機器學習時我們到底在談些什麼

深度學習最近兩年在音訊分析,視訊分析,遊戲博弈等問題上取得了巨大的成果。由於微軟,谷歌等科技巨頭的推動及應用上的可見突破,使得深度學習成為目前學術界和工業界的超熱門話題。包括國內很多公司也樂見其成,適時宣佈自己的產品或演算法也擁抱了深度學習。不過對於具體如何使用,達到了什麼效果等問題諱莫如深。

事實上,關於深度學習的大量研究成果在上世紀已經完成,包括卷積神經網路(CNN)、長短時記憶網路(LSTM),多層網路的表達能力等。宣稱自己在使用某個演算法工具其實並不具備天然的正義性,如何能將工具用好,解決關鍵場景才是我們應該關心的問題。

為提升對非結構化資料的處理,玻森(bosonnlp.com)3

內部也在開展深度學習的討論。接下來的一段時間,我們將不定期更新深度學習的討論 notes。

我們不談情懷,不討論人工智慧是否要統治人類,也不論奇點是否臨近。我們就談點落地的深度學習基礎數學理論,及背後的幾何直觀。世界太大,認知有限,這點上我們遵從維特根斯坦的觀點,“凡能夠說的,都能夠說清楚;凡不能談論的,就應該保持沉默”。

什麼是感知機

人類大腦的神經系統相當複雜,其具體的工作機制至今仍是前沿的生物課題。在1957年時由Cornell大學的學者 Frank Rosenblatt 博士所提出的感知機(Perceptron)模型可以認為是對人類神經系統的一個高度簡化概括:

其中w和b作為模型的引數。

Frank Rosenblatt 博士恐怕是史上對人工智慧貢獻最大的心理學家。他的興趣不僅停留在從數學上抽象出感知機和提出相應的學習演算法,還親自打造了下面這臺被稱之為Mark I Perceptron的“實體”感知機,其具備512個隱藏單元哦!

當加權求和輸入值時,感知機會與0做對比,以確定自己是否處於激發狀態。實際的神經元在人腦中數以百億計。上式中神經元所輸出的狀態非0即1,而實際在計算機所建立的模型中,往往將其泛化:

f為啟用函式(activation function)。

神經網路可以看做是感知機的一種泛化形式,通過遞迴巢狀及選擇不同的啟用函式,我們可以不斷將原始資料x進行變換,或特徵抽取。

通過對上述式子的巢狀,我們可以構造具有更為複雜表達能力的函式。如兩層巢狀形式:

注意到感知機實際上相當於採用Step函式作為啟用函式。其他常用的啟用函式有Sigmoid, Tanh, ReLU等。其中Sigmoid函式

在早期的神經網路研究文獻中被廣泛使用。目前對於大多非結構化資料,人們發現分段線性(piece-wise linear)函式

具備更好的魯棒性,並能夠更快收斂。常見的啟用函式可以參見下表。

常見的神經網路型別

無環結構:
一層神經元的輸出作為下一層神經元的輸入,資訊總是向前反饋。這一型別的神經網路也叫 Feed-forward Nerual Network。卷積網路(Convolutional Nerual Network)也包括在其中。

有環結構:
一層神經元的輸出可以作為當前神經元的輸入,即產生了反饋迴圈(feedback loop)。反饋環表示了神經網路的內部狀態,使得網路的輸出與之前的輸入資料相關。如果把時間維度展開的話,有環結構也相當於隨著時間走的無環結構。這一型別的神經網路也叫 Recurrent Neural Network (RNN)。

隨機梯度下降

對於給定的網路拓撲結構,具體網路引數的確定其實是一個標準的優化問題。我們通過定義一個損失函式(cost function),來衡量當前神經網路的輸出與我們期望的輸出之間的距離。

我們構造的 Net(x, w) 以 w 為引數的,x 為輸入的網路的輸出值。而對 w 引數的尋找,在深度學習中最常用的是隨機梯度下降法(Stochastic Gradient Descent)。其基本思想仍然是讓變數沿著損失函式在目前引數的儘可能下降的方向進行調整

η 稱之為學習率,用以控制修改引數的激程序度。後面的討論中我們會提到,其實嚴格按照梯方向更新並無必要,只需要確保更新能夠降低損失函式即可。這個觀察與Liang Huang etc.在前些年所發表的Structured Perceptron with Inexact Search1可以進行類比。

如果我們能夠得到引數 w 的 Hessian 矩陣,可以規避選擇的問題,但對於只採用梯度這樣一階資訊的優化方法,如何選擇學習率,是否能利用某個引數的歷史更新資訊來估算Hessian矩陣等,都是比較有意思的研究問題。有興趣的朋友可以參考Schaul etc.的 No More Pesky Learning Rates


討論:

  • 感知機是universal的嗎,即感知機是否能近似任意函式?
    感知機可以表達與非門 NAND。而我們知道,在邏輯電路中,NAND 是universal的,即可以表示任意其他的邏輯閘。
    NOT(X) = NAND(X, X)
    AND(X, Y) = NOT(NAND(X, Y))
    OR(X, Y) = NAND(NOT(X), NOT(Y))
    XOR(X, Y) = OR(AND(X, NOT(Y)), AND(Y, NOT(X)))
    因此,計算機模擬的多層感知器可以模擬任何運算。特別的,XOR 的模擬亦可說明多層感知器在分類任務中可以完成非線性分類。

  • 感知機和 Sigmoid 等價嗎?
    Sigmoid 可以很容易用來模擬感知機或 step function 輸出。為驗證這一點,Sigmoid 的所有輸入值擴大 c 倍(c >> 1),即 c(wx+b),除 wx+b=0 這個輸入點,Sigmoid 的行為處處與感知器的輸行為可以任意接近。利用討論1的結論,可以證明二者等價。

  • 打亂神經網路的輸入順序會影響學習的結果嗎?
    全連通的神經網路不會。因為這樣的神經網路對輸入資料沒有區分,且輸出是當下資料的最優解,即相對應的權重向量和 bias。但區域性連通的神經網路比如 Convolutional Nerual Network 就會有影響。

  • 為什麼不直接採用“有多少被錯誤分類的資料個數”作為 cost function 來評估神經網路的表現?
    “有多少被錯誤分類的資料個數”雖然常常是我們優化的最終目標,但因為該函式並不屬於凸函式(convex function),對其優化較為困難(事實上優化該cost function 可以被證明是一個NP問題)。所以人們常採用凸函式作為其“代理”。相關資料可以參考 surrogate loss function1

  • 為什麼梯度下降是朝著下降最快的方向?為什麼隨機梯度能夠收斂?
    根據Cauchy-Schwarz不等式,我們得知向量的點積,在 和負梯度的夾角為0°時取得最小值。因此,在負梯度方向上,損失函式降的最快。並且只要變化向量和負梯度方向的夾角為銳角,即為負。因此,單個數據的下降方向雖然不是整體最優(下降最快)的方向,但只要是走在收斂的路上,就能使得函式逼近極值,因此可以收斂。


上一次的分享我們提到了神經網路的幾個基本概念,其中提到了隨機梯度下降(SGD)演算法是神經網路學習(或者更通用的,一般性引數優化問題)的主流方法。概念上,神經網路的學習非常簡單,可以被歸納為下面的步驟:

(a) 構造神經網路結構(選擇層數、啟用函式等)
(b) 初始化構造出的神經網路引數
(c) 對於給定的訓練樣本與當前的,計算梯度
(d) 通過(隨機)梯度下降演算法更新
例如,不考慮任何正則化因子情況的最簡單引數更新為

神經網路的初學者往往會發現,上述四個步驟當中,對於給定樣本,計算其梯度是最 不直觀 的一個步驟。本文我們玻森(bosonnlp.com)的討論就圍繞解決梯度的核心演算法:後向傳播 演算法來展開。

首先理清一個概念,步驟(d)的梯度下降演算法是一種優化演算法,而我們要討論的後向傳播演算法,是計算步驟(c)中所需要梯度的一種演算法。下面的討論,我們首先完成單引數(即只有一個引數需要學習)的特例情況下的推導,進而通過 動態規劃(Dynamic programming) 思想,將其推導泛化到多變數的情況。需要注意的是,雖然後向傳播概念上並不複雜,所用到的數學工具也很基本,但由於所涉及的變數較多、分層等特點,在推導的時候需要比較仔細,類似繡花。

單引數情況

特例
在討論後向傳播演算法之前,我們簡單回顧一下單變數微積分中的求導規則。來看個例子,假設我們有一個極端簡化的網路,其中只有一個需要學習的引數,形式如下

並且假設損失函式Cost為平方誤差(MSE)。

假設我們只有一個訓練樣本。因為這個形式非常簡單,我們試試將樣本直接帶入損失函式:

顯然當時,我們可以讓損失函式為0,達到最優。下面讓我們 假裝 不知道最優解,考慮如何用梯度下降方法來求解。假設我們猜為最優,帶入計算得到

嗯,不算太壞的一個初始值。讓我們計算其梯度,或者損失函式關於的導數。

設定學習率引數,我們可以通過梯度下降方法來不斷改進,以達到降低損失函式的目的。三十個迭代的損失函式變化如下:

生成上圖採用的是如下Python程式碼

import matplotlib.pyplot as plt
w0, eta, n_iter = 2, 0.02, 30
gradient_w = lambda w: 2*(w**3)
cost = lambda w: 0.5*(w**4)
costs = []
w = w0
for i in range(n_iter):
costs.append(cost(w))
w = w – eta*gradient_w(w) # SGD
plt.plot(range(n_iter), costs)

可以發現,經過30次迭代後,我們的引數從初始的2改進到了0.597,正在接近我們的最優目標

對於一般的情況
回憶一下,上面的結果是基於我們給定 下得到的,注意這裡我們假設輸入訊號為常量。我們將上面的求解步驟做一點點泛化。

重複上面的求解

關於w求導,

注意,上面求導用到了 鏈式法則(Chain Rule),即

或者寫成偏導數形式:

對於一般性損失函式的情況
上式推導基於損失函式為平方最小下得出,那麼我們再泛化一點,對於任意給定的可導損失函式,其關於的梯度:

其中是損失函式關於的導數。實際上這個形式很通用,對於 任意 特定的損失函式和神經網路的啟用函式,都可以通過這個式子進行梯度計算。譬如,對於一個有三層的神經網路

同樣通過鏈式法則,

上式看上去比較複雜,我們可以在符號上做一點簡化。令每一層網路得到的啟用函式結果為,即, 那麼:

即:不論複合函式本身有多麼複雜,我們都可以將其導數拆解成每一層函式的導數的乘積。

上面的推導我們給出了當神經網路僅僅被一個可學習引數所刻畫的情況。一句話總結,在單引數的網路推導中,我們真正用到的唯一數學工具就是 鏈式法則。實際問題中,我們面對的引數往往是數以百萬計的,這也就是為什麼我們無法採用直覺去“猜”到最優值,而需要用梯度下降方法的原因。下面我考慮在多引數情況下,如何求解梯度。

多引數情況

首先,不是一般性的,我們假設所構建的為一個層的神經網路,其中每一層神經網路都經過線性變換和非線性變換兩個步驟(為簡化推導,這裡我們略去對bias項的考慮):

定義網路的輸入,而作為輸出層。一般的,我們令網路第層具有個節點,那麼。注意此時我們網路共有個引數需要優化。

為了求得梯度,我們關心引數關於損失函式的的導數:,但似乎難以把簡單地與損失函式聯絡起來。問題在哪裡呢?事實上,在單引數的情況下,我們通過鏈式法則,成功建立第一層網路的引數與最終損失函式的聯絡。譬如,的改變影響函式的值,而連鎖反應影響到的函式結果。那麼,對於值的改變,會影響,從而影響。通過的線性變換(因為),的改變將會影響到每一個

將上面的過程寫下來:

可以通過上式不斷展開進行其梯度計算。這個方式相當於我們枚舉了 每一條 改變對最終損失函式影響的 路徑。通過簡單使用鏈式法則,我們得到了一個 指數級 複雜度的梯度計算方法。稍仔細觀察可以發現,這個是一個典型的遞迴結構(為什麼呢?因為定義的是一個遞迴結構),可以採用動態規劃(Dynamic programming)方法,通過記錄子問題答案的進行快速求解。設用於動態規劃的狀態記錄。我們先解決最後一層的邊界情況:

上式為通用形式。對於Sigmoid, Tanh等形式的element-wise啟用函式,因為可以寫成的形式,所示上式可以簡化為:

即該情況下,最後一層的關於的導數與損失函式在導數和最後一層啟用函式在的導數相關。注意當選擇了具體的損失函式和每層的啟用函式後,也被唯一確定了。下面我們看看動態規劃的 狀態轉移 情況:

成功建立的遞推關係,所以整個網路的可以被計算出。在確定了後,我們的對於任意引數的導數可以被簡單表示出:

至此,我們通過鏈式法則和動態規劃的思想,不失一般性的得到了後向傳播演算法的推導。


討論

  • 後向傳播演算法的時間複雜度是多少?

不難看出,為了進行後向傳播,我們首先需要計算每一層的啟用函式,即,這一步與後向傳播相對,通常稱為前向傳播,複雜度為,與網路中引數的個數相當。而後向傳播的步驟,通過我們的狀態轉移的推導,也可以看出其複雜度為,所以總的時間複雜度為。需要注意的是,採用mini-batch的方式優化時,我們會將個樣本打包進行計算。這本質上將後向傳播的矩陣-向量乘積變成了矩陣-矩陣乘積。對於任意兩個的矩陣的乘法,目前理論最優複雜度為的類Coppersmith–Winograd演算法。這類演算法由於常數巨大,不能很好利用GPU並行等限制,並沒有在真正在機器學習或數值計算領域有應用。尋求智力挑戰的朋友可閱讀Powers of tensors and fast matrix multiplication

  • 對於後向傳播的學習演算法,生物上是否有類似的機制?

這是一個有爭議的問題。Hinton教授在其How to do backpropagation in a brain演講當中,講到了人們對於後向傳播不能在生物學上實現的三個原因:
a) 神經元之間不傳播實數訊號,而通過尖峰訊號(spikes)溝通。Hinton解釋說通過Poisson過程,意味著可以傳遞實數訊號,並且採用spike而不是實數進行訊號傳遞是一個更魯邦的過程。
b) 神經元不會求導()。Hinton說通過構建filter可以實現(數值)求導過程。
c) 神經元不是對稱的?或者說神經元連線不是一個無向圖而是有向圖。這意味著通過前向傳播與後向傳播的並不應該是一個。Hinton教授解釋說,通過一些數值實驗發現,其實即便前向後向的不對稱(比如讓後向傳播的W為固定的隨機矩陣),採用類似的梯度演算法也可以收斂到不錯的解。

我不同意Hinton教授的觀點。其解釋在邏輯上混淆一個基本常識:大腦可以做到並不意味著大腦事實是這樣完成運算的。其實我們已經看到,通過與非門也可以完成所有的函式運算,但這並不代表我們大腦裡面一定裝載了10億個與非門。而有大量證據表明(如能耗,小樣本學習),後向傳播演算法與真實大腦學習的機制相去甚遠。所以我覺得更合理的對待,仍然是將後向傳播作為一種高效計算巢狀函式梯度的數值演算法工具,而不必強行將其附會成大腦的工作原理。

正則化

相信對機器學習有一定了解的朋友對正則化(Regularization)這個概念都不會陌生。可以這麼說,機器學習中被討論最廣泛也可以說是最重要的一個問題,就是防止 過擬合(Overfitting) 。

為什麼這麼說呢?因為通過增加模型複雜性來在訓練資料上達到完美的擬合實在太過容易。如果僅希望在訓練資料上得到輸入預期的輸出,那麼我們僅僅需要記住所有的訓練資料就可以了。而對於機器學習,我們真正的關心的問題,是在那些沒有見過的資料上,模型的表現如何,也就是模型的泛化能力。

至於正則化的方法,很多時候被大家簡化理解為了“在目標函式上增加關於引數的範數”的簡單表達,但對於為何需要增加範數約束,以及增加以後所產生的效果不甚明瞭。

我們這裡通過一個最簡單的Logistic regression的例子來看看增加範數約束的必要性。對於Logistic regression問題,通過給定的個數據,其中,我們希望尋求到一個足夠好的,使得儘可能接近,其中就是我們前文神經網路常用的Sigmoid函式。我們可以將Sigmoid函式的輸出解釋為某個輸出為1的概率,那麼按照最大似然原則,需要求解如下優化問題:

假設我們求得某個,能夠成功讓所有的正樣本,而負樣本輸出,已經意味著我們可以通過該分類器完美對資料進行區分。但如果仔細檢視我們的最優化問題可以發現,如果我們將替換成,則可以進一步降低目標函式值,我們可以通過不斷放大來進一步降低目標函式值。事實上,所表達的是同一個分類器超平面(hyperplane),可以通過限制使其收斂到唯一解。

上面的例子是數學上一類Inverse problem1的特例。這其中最簡單的當屬線性方程組求解的問題。當我們已知其生成過程,其中為獨立同分布(i.i.d)的高斯隨機噪聲時,可以證明,採用範數進行優化,是在最大似然意義下的理論最優解:

類似上述能夠給出具體數學描述的生成過程,及其Inverse problem最優求解方法的問題還有很多。最近哥倫比亞大學John Wright教授在字典學習問題的突破(參見Complete Dictionary Recovery over the Sphere)的結果非常漂亮,堪稱是這一類Inverse problem和正則化應用的典範。

談回深度學習,我們可以看到目前應用最廣泛的兩類正則化的方法,一類是通過給網路引數增加的範數(並且往往p=2):

另一類是採用由Hinton et. al所提出的Dropout方法進行正則化(參見Dropout: A Simple Way to Prevent Neural Networks from Overfitting)。並且這兩類方法經常同時在訓練神經網路時被採用。

範數正則化

這兩種正則化方法在深度學習的應用,與其說是理論家的貢獻,不如說是實踐者的勝利。雖然通過新增範數的形式在傳統凸優化中有大量可被證明正確性的應用,並且將這個想法使用於神經網路極為自然,但對於超過一層隱藏層的神經網路,範數所帶來的優勢還很難被嚴格證明。這裡我提供幾個非完全嚴格的“直觀”解釋:

  • 在原目標函式的基礎上增加,將原函式進行了一定程度的平滑化,這個可以從其梯度函式有所體現。
  • 對於一類存在大量駐點(Stationary point,即梯度為0的點),增加範數意味著將原本導數為零的區域,加入了先驗知識進行區分(幾何上,意味著原本一個平臺的區域向0點方向傾斜),這樣可以幫助優化演算法至少收斂到一個區域性最優解,而不是停留在一個鞍點上。

  • 通過限制引數在0點附近,加快收斂,降低優化難度。回憶一下,對於一類常見啟用函式,如Sigmoid,滿足:單調有界。根據單調有界定理,對於任意小的

    相關推薦

    我們談論機器學習我們到底在什麼

    深度學習最近兩年在音訊分析,視訊分析,遊戲博弈等問題上取得了巨大的成果。由於微軟,谷歌等科技巨頭的推動及應用上的可見突破,使得深度學習成為目前學術界和工業界的超熱門話題。包括國內很多公司也樂見其成,適時宣佈自己的產品或演算法也擁抱了深度學習。不過對於具體如何使用,達到了什麼效果等問題諱莫如

    [Erlang 0121] 我們談論Erlang Maps,我們談論什麼 Part 3

    Erlang/OTP 17.0 has been released    Erlang/OTP 17.0釋出了,不過Maps相關的設計還沒有塵埃落定,目前:              With Maps you may for instance:               -- M0

    我們談論Erlang Maps,我們談論什麼 Part 1

          Erlang 增加 Maps資料型別並不是很突然,因為這個提議已經進行了2~3年之久,只不過Joe Armstrong老爺子最近一篇文章Big changes to Erlang掀起不小了風浪.這篇文章用了比較誇張的說法:"Records are dead - long live maps !",

    大家都在談論機器學習的時候,我們為什麼還要強調硬體?

    上一篇介紹波士頓動力(Boston Dynamics Institute, 以下簡稱BDI)Atlas2的文章,得到了相當多的關注(大量的評論和私信),導致有很多有趣的評論、很有水準的問題、尖銳的批評沒有及時回覆討論,當然也出現瞭如下共性的問題需要在這裡再寫一篇文章,分享自己的想法也希望和大家一起討

    我們談論單測我們談論什麼

    關於如何提升團隊的程式碼質量,我曾經做過很多嘗試。由於團隊成員都有繁忙的開發工作,公司也不是學校,不可能投入太多去面面俱到地教層層選拔招聘進來的程式設計師這些基礎知識,所以,做法一般是以點帶面,比如引入 sonar 程式碼檢查推動大家去掌握一些以前未曾注意到的編碼細節,比如通過針

    我們談論自動化測試我們談論什麼(轉自51Testing)

    按照本專欄的計劃,本來第四篇文章會以“敏捷測試工程師的績效”作為主題,但由於以上的原因,我最終還是選擇了自動化測試這個主題來談論敏捷測試。和前三篇文章相比,這一篇更像是雜感。   實際上,在本專欄的第二篇文章《自動化測試-敏捷測試的基石 》 中我已經就敏捷測試中的自動化測試

    【輿情報告】我們談論王者榮耀,我們談論什麼?

           近期,現象級遊戲《王者榮耀》被推至輿論的風口浪尖。手機遊戲到底有沒有“陷害人生”?青少年遊戲沉迷到底是誰之過?中科天璣輿情分析師針對此熱點話題進行了深入解讀,併發布了輿情分析專項報告。 一、事件概述       《王者榮耀》,一款由騰訊遊戲開發運營的手機遊

    話題討論&征文--談論大數據我們什麽 獲獎名單發布

    時間 pos why 圖書 fill tro 終端 打印 sharp 從社會發展趨勢的角度,非常明顯大數據會是眼下肉眼可及的視野範圍裏能看到的最大趨勢之中的一個。從傳統IT 業到互聯網、互聯網到移動互聯網,從以智能手機和Pad

    第一章 為什麽我們機器學習感興趣?(六)

    銷售 學習 智能算法 實體 對象 計算 互聯 行為模式 生活 註:本書屬作者免費翻譯,如有版權問題,請聯系我刪除。如有轉載,請註明出處。 六、所有這些數據:數據地震 所有電腦化機器和服務所產生的數據曾經都是數字化技術的副產品,計算機科學家已經對數據庫進行了大量研究以

    機器學習入門好文:讓我們機器學習

    轉自 飛鳥各投林 導讀: 在本篇文章中,將對機器學習做個概要的介紹。本文的目的是能讓即便完全不瞭解機器學習的人也能瞭解機器學習,並且上手相關的實踐。當然,本文也面對一般讀者,不會對閱讀有相關的前提要求。 在進入正題前,我想讀者心中可能會有一個疑惑:機器學習有什麼重要性,

    我們機器學習

    導讀:在本篇文章中,將對機器學習做個概要的介紹。本文的目的是能讓即便完全不瞭解機器學習的人也能瞭解機器學習,並且上手相關的實踐。當然,本文也面對一般讀者,不會對閱讀有相關的前提要求。 在進入正題前,我想讀者心中可能會有一個疑惑:機器學習有什麼重要性,以至於要閱讀完這篇非常長的文章呢? 我並不直接回答

    我們機器學習起(網上看到的最好的一篇入門介紹)

    導讀:在本篇文章中,將對機器學習做個概要的介紹。本文的目的是能讓即便完全不瞭解機器學習的人也能瞭解機器學習,並且上手相關的實踐。當然,本文也面對一般讀者,不會對閱讀有相關的前提要求。 在進入正題前,我想讀者心中可能會有一個疑惑:機器學習有什麼重要性,以至於要閱讀完這篇非常長的文章呢? 我並不直接回答

    機器學習我們生活的改變

    1.1 背景正如愛因斯坦所說:“從希臘哲學到現代物理學的整個科學史中,不斷有人試圖把表面上極為複雜的自然現象歸結為幾個簡單的基本概念和關係,這就是整個自然哲學的基本原理。”人類進化的發展史,從某種意義上來講就是不斷歸納經驗進而演繹的過程。從刀耕火種的新石器時代到近代的工業革命

    以一元及二元函式為例,通過多項式的函式影象觀察其擬合效能;以及對用多項式作目標函式進行機器學習的一些理解。

     先給出程式碼: import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib import pyplot as plt from datetime import datetime t

    談論迭代器,我什麼?

    當談論迭代器時,我談些什麼? 花下貓語:之前說過,我對於程式語言跟其它學科的融合非常感興趣,但我還說漏了一點,就是我對於 Pyth

    我學完Python我學了什麼

    學習Python的這幾天來,覺得Python還是比較簡單,容易上手的,就基本語法而言,但是有些高階特性掌握起來還是有些難度,需要時間去消化。Python給我最大的印象就是簡潔,這也正是我為什麼不太喜歡Java的原因之一。 一、Python簡介     Python是一

    跑步,我什麼

    上一個週六,我第一次參加了馬拉松活動。說是馬拉松,實際上參與的是最低一檔的距離:6公里。6公里這個距離對於不愛運動的人來說,可能是一個非常可怕的數字,但對於經常跑步的人而言,實在是一個拿不出手的距離。這個離半馬21公里,全馬42公里還是差得太遠,更別說現在還

    HTTP ,我什麼?

    ![](https://upload-images.jianshu.io/upload_images/80097-faada4f8959b98c9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 當我們開啟網站時也許不會去留意網站前面的HTT

    我們談論企業級存儲市場我們談論(做)了什麽

    用戶界面 OS 兼容 open 應用 之間 bottom bad 部門 摘要: APSARA Block Storage是阿裏雲彈性計算塊存儲團隊推出的一款企業級分布式塊存儲產品,為企業級市場頭部客戶量身打造,構建高性能、彈性、可靠的大規模橫向擴展雲存儲服務平臺。可對接多種

    談論特性團隊我們什麼?

    當談論特性團隊時我們在談些什麼 Part I: What and Why “對手剛出了個新功能,這個功能咱們之前也討論過,這次要做起來,要快,大約什麼時候能上線?” “得去找個人做需求和設計,還要約運營聊一下具體需求; 現在產品經理手頭都有別的事,要等; 需求出來後評審,評審完開發,單開發工作量,目測三天差