主頁 > 資料庫 > 【人工智能】從梯度下降演算法到人工神經網路

【人工智能】從梯度下降演算法到人工神經網路

2020-10-07 18:29:19 資料庫

提到人工智能演算法,人工神經網路(ANN)是一個繞不過去的話題,但是對于新手,往往容易被ANN中一堆復雜的概念公式搞得頭大,最后只能做到感性的認識,而無法深入的理解,正好最近筆者本人也在經歷這個痛苦的程序,本著真理越辯越明的態度,索性坐下來認真的把這些頭大的問題梳理一番,試試看能不能搞清楚ANN背后的數學原理,

其實ANN 的流程概括來說倒不是很復雜,以最簡單的前饋神經網路為例,無非就是

搭建網路架構 ---> 通過比較輸出與標簽的差值構建損失函式的框架 ---> [給出一個訓練樣例(包括ANN的輸入值和輸出值) ---> 得到損失函式 ---> 隨機給出一組初始引數 ---> [ 利用梯度下降演算法從后往前調整網路引數(誤差反向傳播,BP)] ] ---> 得到所有引數值 ---> 得到ANN并使用

其中大括號 [] 里的內容是需要反復迭代的(注意有一部分是雙重回圈),

在ANN的一堆操作里,梯度下降演算法是一個相對獨立的程序,不妨就讓我們從梯度下降演算法開始吧,

一、梯度下降到底在干什么

其實這個問題非常簡單,只是大家被梯度下降復雜的程序搞蒙了,忘記了它的本質,梯度下降演算法自始至終都在干一件事——就是找到函式的極值點,當然確切的說是極小值點,但是,這種方法不同于以往我們在高等數學里學到的找極值點的方法,那么我們首先就要問,求極值的經典方法不香嗎?

1.求極值:傳統的方法不香嗎?

要回答這個問題,讓我們先快速回顧一下在中學和大學里學到的傳統的求極值點的方法,

對于一元函式來說,極值可能出現在一階導函式為0的點(駐點)或是導數不存在的點,

例如要找到 f(x) = x^2 + 3x 的極值點
求導得 dy/dx = 2x + 3
令 dy/dx = 0
就得到 x = -1.5 時,導函式為0,

注意,上面找到的只是可能的極值點,也就是極值存在的必要條件,還需要驗證一下充分條件,才能確定極值,這時,可以判斷二階導的正負性、或是判定一階導在可能的極值點兩邊的正負情況,回到我們的例子

當 x < -1.5 時,2x + 3 < 0
當 x > -1.5 時,2x + 3 > 0
說明函式在x = -1.5 附近先下降、后上升
該點是一個極小值點

對于二元函式f(x,y),情況更復雜一些,首先要找出該函式的駐點和偏導數不存在的點,這些點仍然只是可能的極值點,而二元函式的駐點需要同時滿足兩個偏導數為0的條件,即

顯然,這里的駐點是需要解這樣一個二元方程才能求得的,對于駐點分別求出其3個二階偏導數的值,再根據一些規則才能判斷是不是極值點,

還需注意這個判斷規則是不同于一元函式的,因為一元函式極值的充分條件只需要考察一個二階偏導數,而這里則需要綜合考察二元函式的3個二階偏導數,計算量明顯增大了,對于偏導數不存在的情形還需要特判,


綜合以上,我們可以看出使用經典方法雖然能準確的解出極值點,但當函式自變數的個數很多時,用這種方法求解極值點還真的不香,比如:

  • 該方法方法不具有普適性,所謂普適性,就是不能簡單的向多元推廣,從一元到二元的例子可以看出,函式的自變數個數每增加一元,就要研究新的求解方案,可以想象如果是三元函式,其二階偏導數的個數更多,則判斷極值的充分條件還要來的更加復雜,而ANN中可能會求解上億元函式的極值點,
  • 其次,這種方法需要解多元方程組,而且這些方程還不一定都是線性的,對于這種多元的非線性方程組,我們的直觀感受就是很難解出,事實上,雖然存在一些可供編程的數值計算解法,但計算量大,且求出的是近似解,具有一定的局限性,

基于此,為了找出多元函式的極值點,我們還需另尋他法,這種方法要簡單易行,特別是要能簡單的向任意元函式推廣,而且這種方法要能夠適應計算機數值計算的特點,畢竟我們這套程式肯定是要放在電腦上跑的,而這就是傳說中的梯度下降演算法

2.什么是梯度?

梯度的概念其實也不難,但為了讓盡可能多的人明白這一概念,我們還是從一元函式開始吧,不過現在我們的目標是——用純粹數值計算的方法,從函式上的某一點出發,找到函式的極值,這里我們只考察極小值,

2.1一元函式找極值:從列舉試探法到梯度下降法

以函式y = x^2為例,讓我們看看如何找到極值,

既然是從函式上的某一點出發,那么不妨設想我們在x = 1 的地方,這個地方是不是極小值點呢,我們可以試探一下,

向右走0.5,發現f(1.5) > f(1),說明這個方向是上升的方向,不應該選擇這個方向;
向左走0.5,發現f(0.5) < f(1),說明這個方向是下降的方向,選擇這個方向;
再向左走0.5,發現f(0) < f(0.5),說明這個方向是下降的方向,選擇這個方向;
再向左走0.5,發現f(-0.5) > f(0),說明這個方向是上升的方向,不應該選擇這個方向,
至此,我們可以將x = 0作為極小值點,

回顧這個程序,我們將尋找極小值點的程序抽象如下:

  • 首先,選擇一個方向
  • 試著沿該方向走一小步,并據此判斷該方向是否合理,如果合理,則走這一步;如果不合理,換一個方向
  • 反復重復第二步,直到找到極小值點

當然這里還有幾點值得注意

  • 第一,對于一元函式來說我們只有向左走或向右走兩個選項,換句話說,每一步我們的選擇是有限的,是可以列舉的,因此,這個方法我把它稱之為列舉試探法
  • 第二,判斷方向其實不必這樣試錯,直接求導就好,如果某點的導數值 > 0,說明在該點處函式是遞增的,為了找到極小值,應該向左走;而如果導數值 < 0,則反之向右走即可,
  • 第三,這種方法是不一定能找到極小值的,能不能找到極值點受選擇的起始點以及每次前進的步長這兩個因素影響,

對于第二點,我們可以引出梯度的定義了,

梯度是一個向量,它總指向當前函式值增長最快的方向,而它的模長則是這個最快的增長率(導數)的值,想要得到梯度向量,也很簡單,它在x, y, z……等方向上的分量(坐標)就是相應的導數值,于是我們求導就可以了,

對于一元函式,函式變化的方向只有兩個,我們定義一種一維的向量來表示梯度,比如5i,-5ii前的數為正時,代表向量指向x軸正向;i前的數為負時,代表向量指向x軸負向,???由下圖可以看出,按照上述定義規定的梯度向量自然的指向了函式增長的方向,是不是很神奇,

由于梯度的方向正是函式增長最快的方向,所以梯度的逆方向就成了函式下降最快的方向,當然對于一元函式來說,沒有最快的方向的概念,因為畢竟就兩個方向而已,根本沒得比,不過有了梯度,我們就可以進一步簡化上述尋找極小值點的程序:

  • 首先,求出某點的梯度
  • 沿梯度的反方向移動一小步
  • 反復進行第一、二步,直到找到極小值點
仍以函式 y = x^2,起始點x = 1為例,讓我們看看如何用梯度找到極值,
初始x = 1, 步長step = 0.5
#在我們的例子里,梯度的計算式為2xi,i是指向x軸正向的單位向量
求x = 1處的梯度為2i,梯度反方向為-i #注意這里我們只關注梯度的方向,至于梯度的模長則不必在意
沿此方向走一步,x新 = x舊 + step * 負梯度方向上單位向量的坐標 = 1 + 0.5 * (-1) = 0.5
求x = 0.5處的梯度為1i,梯度反方向為-i
沿此方向再走一步,x新 = 0.5 - 0.5 * 1 = 0
求x = 0處的梯度為0,說明到達極值點

以上就是用梯度找極小值點的程序,也就是梯度下降演算法所做的事情,其實不難理解對吧,

可以看出,相比于列舉試探法,梯度下降法明顯智能了許多,它直接給出了正確的方向,不需要我們一步步試探了,此外,使用梯度下降法不必再關注具體的函式值,只需要把注意力放在導數上,而且只關注一階導數即可

在后面,我們還將給上面提到的步長step換一個高大上的名字——學習率,這樣就完全是機器學習里的叫法了,

這里用到梯度的時候,我進行了單位化操作,其實也可以不進行這一步,這樣當函式變化比較劇烈的時候,移動的距離就比較多;函式變化比較平緩的時候,移動的距離就比較短,比如,在我們這個例子里,只需一輪迭代就能得到結果了,

初始x = 1, 學習率step = 0.5
#在我們的例子里,梯度的計算式為2xi,i是指向x軸正向的單位向量
求x = 1處的梯度為2i,梯度反方向為-2i #注意這里我們既關注梯度的方向,也關注梯度的模長
沿此方向走一步,x新 = x舊 + step * 負梯度的坐標 = 1 + 0.5 * (-2) = 0
求x = 0處的梯度為0,說明到達極值點

好了說完了梯度,對于前面第三點提到的找不到極值的情形,我們舉兩個具體的例子

還是函式y = x^2,如果起始點選為0.4,而學習率仍為0.5,在采用單位化梯度向量的情形下,則無法找到事實上的極小值點

?對于這種情況,我們可以通過減小學習率使結果盡可能精確,例如我們將學習率設定為0.1,就仍然能得到精確的結果,事實上,在實際操作中,一般也會把學習率設定為0.1,

而對于這種有多個極值點的函式,這種方法是沒法找到全部極值點的,更遑論找到全域的極值點了,這時,我們可以在演算法里加入一些隨機性,使其有一定概率跳出可能陷入的區域極值點,

?

?2.2 多元函式的梯度

前面說過梯度下降演算法的好處之一在于可以很方便的向多維推廣,現在我們以二元函式為例,看看梯度是如何幫助我們找到極值點的,

這次我們的函式變成了f(x,y) = x^2 + y^2,起始點選擇為(-5, -5),學習率仍設定為0.5,現在我們的目標是從這個點出發,找到該函式的極值點,我們知道這個極值點應該是(0, 0),

這里與一元函式有幾點不同:

  • 首先,二元函式描述的是一個自變數和兩個因變數之間的關系,也就是說函式的定義域是一個二維平面,我們要找的極值點就在這個二維平面上
  • 其次,由于是在二維平面上尋找極值點,我們每一步可以選擇的方向不再局限于一維時的向左或向右,而是瞬間變成了無窮多個方向,因此,列舉試探法徹底宣告失效,還好我們有更智能的梯度下降法
  • 一元梯度定義式里的導數現在已經換成了多元函式的偏導數,

好了,現在演算法開始:

起始點坐標(-5,-5), 學習率step = 0.5
#在我們的例子里,梯度的計算式為2xi + 2yj,i和j分別是指向x軸正向和y軸正向的單位向量
求點(-5,-5)處的梯度為-10i-10j,負梯度為10i+10j,寫成坐標形式就是(10,10)
在點(-5,-5)處沿此梯度走一步

根據公式 向量坐標 = 終點坐標 - 起點坐標,得終點坐標 = 起點坐標 + 向量坐標

這里,終點坐標是(x新, y新),起點坐標是(x舊, y舊) = (-5, -5)
向量坐標是負梯度坐標 = (10,10),再考慮學習率step,就可以得到
(x新, y新) = (-5,-5) + 0.5 * (10, 10) = (0, 0)

求(0, 0)處的梯度為零向量,說明到達極值點

將上述程序抽象,我們就得到了梯度下降演算法的全部邏輯

我們要找函式的極小值點(使函式取值盡可能小的那一組自變數),

因為,梯度的方向是函式值增長速度最快的方向,

所以,沿著梯度的反方向函式值下降最快,

所以,只要沿著梯度的反方向一步步逼近就有可能找到那一組使函式取值盡可能小的自變數

如何沿著梯度的反方向一步步逼近呢?

我們隨機指定一個起點坐標(一組自變數取值),然后沿著梯度的方向求出未知的終點坐標

梯度是一個向量,本身也具有坐標

通過上面的迭代公式,無論是多少元的函式,它的一個個自變數們都會比較快的接近極值點(或者其近似),這樣我們就可以找到一組自變數值,使得函式值盡可能的小,

2.3 小結

  • 梯度的計算公式為
  • 梯度是一個向量,它總指向當前函式值增長最快的方向,而它的模長則是這個最快的增長率(導數)的值,
  • 梯度下降法是一種通過數值計算求解函式極值點的方法
  • 其程序概括來說就是順著梯度的反方向一步步逼近可能的極值點
  • 使用梯度下降法的理由在于求極值點的其他方法(如傳統法、列舉試探法)不具有可計算性,無法編程實作
  • 梯度下降法可以很方便的向多元函式推廣,利于撰寫程式
  • 記住在這個程序中,我們要找的是極值點(使函式取極值的那一組自變數),而不是具體的極值
  • 梯度下降法的劣勢在于不一定能找到全域最優解

二、人工神經網路(ANN)

如果是第一次聽到人工神經網路這個名詞,不免會覺得比較高大上,好像我們已經可以模仿神秘的神經系統了,其實它只是一個數學模型而已,當然ANN的效果是令人眼前一亮的,好像計算機一下子真的有了人的能力,可以識人、識物,

但其實稍加抽象便能發現,這個東西無非就是個分類器,它的輸入是一張圖片,或者確切的說就是一堆代表像素點的數值,而輸出則是一個類別,

所以說白了,所謂的人工神經網路其實就是一個超大規模的函式,

這就好比飛機和鳥兒的關系,讓飛機飛起來靠的不是依葫蘆畫瓢造一個人工鳥,而是靠流體力學中的原理建立數學模型,然后計算得出飛機的尺寸、造型,并設計相應的發動機,

1.神經元的數學模型

盜一張老師ppt里的圖說明問題,可以看出ANN中的每一個節點(也就是所謂的神經元)就是這樣一個簡單的線性函式模型,

當然通過激活函式我們可以制造一點非線性的因素,以提高模型的表達能力,這樣的話下面的神經元就代表這樣一個函式

out(u) = \frac{1}{1+e^-^u},其中,u(x_1, x_2, x_3) = w_1x_1+w_2x_2+w_3x_3+b這里w1, w2, w3, b都是引數,x1, x2, x3是函式的輸入,也就是因變數,

常用的激活函式在這里(仍然盜用老師的ppt,捂臉逃~)

以上就是所謂的人工神經元或者叫人造神經元,很多很多這樣的神經元按一定規則相連就構成了ANN,所以我才說ANN就是一個超大規模的函式而已,

是不是和你想象中的高大上的神經元大相徑庭,但是我們現在所謂的人工智能其實就是這樣的數學模型而已,無論是簡單的影像分類器還是戰勝人類的AlphaGo,都是靠這樣的數學計算算出來結果的,而不是靠什么化腐朽為神奇的力量,

2.ANN是如何煉成的?

知道了ANN的本質,現在就讓我們看看得到一個ANN需要怎么做?這里,請留意我們會遇到不同功能的函式,千萬不要搞混了,

既然ANN是一個超大規模的函式,那么首先我們做的就是搭建起這個函式的架構,也就是設計人工神經網路的架構,
這時這個函式就有一堆引數待定了,
接下來我們準備一堆訓練資料訓練ANN,也就是把上面提到的待定引數都給他確定了,
模型完成,可以使用,

顯然,最關鍵的是第三步——確定未知引數,

這里首先解釋訓練資料,我們知道ANN是一個分類器也是一個函式,這個函式讀取一些輸入值,經過復雜的計算后得到輸出值,這些輸出值可以被解釋為類別,而訓練資料就是輸入值和最后的輸出值都已知的一組資料,換句話說就是已知一組函式的自變數和因變數的對應關系,

再說的明白點,我們的任務就是,已知函式的架構、函式的一組輸入值和輸出值,但不知道函式的一些引數,現在要推出這些未知引數,我把這里我們要求出的這個函式稱之為目標函式,于是,一言以蔽之,我們的任務就是求出目標函式的未知引數,

為了完成這個任務,我們引出另一個重要的概念——損失函式,

2.1 損失函式

在這里,我們玩一點小心機,注意了,這里很關鍵!!!

既然我們已知目標函式的一組輸入和輸出,而未知其引數,那么我們不妨將計就計將這些未知引數直接視為因變數,而將目標函式的輸入直接代入進去,這樣我們不就得到了一個自變數是目標函式的所有未知引數函式整體完全已知的函式了嗎?

這時,如果能找到一組合適的未知引數,這個函式應該能輸出和已知輸入對應的輸出完全一致的值,

于是我們可以通過作差比較定義損失函式了

上圖給出了損失函式的兩種形式,為了計算方便,一般我們會選用第二種均方誤差的形式,這里之所以出現了求和形式,是因為ANN的輸出端可能對應了多組函式,比如把一張圖片分成不同類別的概率,后面我們引入一個直觀的例子,一看便知,

這里一定要注意,損失函式看起來雖然還有目標函式的影子,但實際已經完全不同了,我們串列比較一下

目標函式損失函式
表現形式f(i_1, i_2, i_3\cdots )loss(w_1, w_2, w_3\cdots )
生成方式事先搭好框架,再通過訓練得出待定引數將目標函式的輸出與實際值作差得到框架,然后代入一個具體的訓練樣例(包括輸入值與標簽值)
自變數(i_1, i_2, i_3\cdots )——神經網路的輸入值(實際場合中可以是一張圖片的所有像素值)(w_1, w_2, w_3\cdots )——目標函式的待定引數
函式值(因變數)含義屬于不同分類的概率預測值與實際值的差值(越小越好)
特點我們最終想要得到的函式,可以用來作影像分類,是線性函式與非線性函式的組合,規模很大,自變數與引數都很多用來求出目標函式的過渡函式,非負,最小值為0,一般要使用梯度下降法找到極值點

舉個例子看看函式變異的程序吧,設原函式為f(x_1, x_2) = ax_1^2 + bx_2^2 +c,這是一個關于x_1,x_2的二元函式,其中a, b, c均是常數,也可以叫待定引數,現在我們給出一組具體的函式輸入值比如,令x_1 = -1 ,x_2 = 3把它們代入函式,并且將a, b, c視為變數,則函式變成了關于a, b, c的三元函式,記作f(a, b, c) = a + 9b +c

綜上,求目標函式的程序,就變成了尋找損失函式極值點的程序,而尋找極值點不正可以用上面介紹的梯度下降法實作嗎?

2.2 一個實體:關于鏈式求導和誤差反向傳播(BP)

行文至此,有關ANN的重要概念,我們還剩下鏈式求導和誤差反向傳播(BP)沒有提及,讓我們用一個實體融會貫通一下,

考慮下面這個簡單的ANN

這個ANN只有4個神經元,分別是h_1, h_2, o_1, o_2,它輸出兩個目標函式,均是輸入變數(i_1, i_2, i_3)的函式,分別由神經元o_1, o_2輸出,可以記為

這里給f_1,f_2加上帽子,表示這兩個函式(即目標函式)的函式值是預測值,區別于訓練資料給出的實際標簽值,而(w_1, w_2, \cdots, w_1_0, b_1, b_2)均是目標函式的待定引數,

這里我們假定神經元h_1, o_1, o_2均采用sigmoid激活函式,即g(u) = \frac{1}{1+e^-^u},而神經元h_2不采用激活函式,

現在定義損失函式為

注意接下來我們會將具體的一組輸入變數(i_1, i_2, i_3)帶進去,這樣損失函式就被視作以(w_1, w_2, \cdots, w_1_0, b_1, b_2)為自變數的多元函式(具體的自變數變化程序參見上文描述),其中,\hat{f_1},\hat{f_2}是中間變數,它們均是以(w_1, w_2, \cdots, w_1_0, b_1, b_2)為自變數的多元函式,

現在只要給出一個包含輸入輸出資料的訓練樣例,損失函式就成為不含未知引數的完全確定的函式,而我們要做的就是找到這個損失函式的極小值,

按照梯度下降演算法的推導,此時我們只要按照下面的步驟就可以找出這個極小值:

隨機指定一組初始引數(w_1, w_2, \cdots, w_1_0, b_1, b_2) ---> [計算Loss函式關于各個引數的偏導數,注意這一步要代入引數的具體數值,也就是說這一步得到的是一個數 ---> 按照梯度下降的公式更新各個引數值直到滿足一定條件為止]

其中大括號 [] 里的內容是需要反復迭代的,

現在,我們以其中的幾個引數為例,看看在調整程序中會遇到什么新問題,

先試試調整w_7吧,這時我們需要求出損失函式對自變數w_7的偏導數值(注意是數值,不是運算式),為此寫出它的依賴關系:

這里,Loss函式依賴于變數\hat{f_1},\hat{f_2},但\hat{f_2}w_7無關,回想多元函式求偏導數的規則,我們對w_7求導時,應將\hat{f_2}視為常數,

\hat{f_1}依賴于變數w_7,w_8,b_1,因此這里應按照復合函式求導法則,即傳說中的鏈式求導法則先讓Loss函式對變數\hat{f_1}求導,再令\hat{f_1}w_7求導,即:

這里有幾個要點:

  • 首先,式子的每一項均加下標w,表示要將具體的一組(w_1, w_2, \cdots, w_1_0, b_1, b_2)代入式子,得到一個數值
  • 其次,當g(u)表示sigmoid函式時,對其求導的結果就是g(u) * [ 1 - g(u) ]
  • 函式u_1(w_7, w_8, b_1) = w_7h_1 + w_8h_2 + b_1對變數w_7求偏導時,雖然h_1也是函式,但它是關于自變數w_1,w_2,w_3的函式,與w_7無關,因此視為常數,這樣,對w_7求偏導的結果就是h_1
  • 等式右端最后得出的三項,在給出一個訓練樣例,并指定初始引數(w_1, w_2, \cdots, w_1_0, b_1, b_2)后,是可以獨立計算出結果的

求出損失函式對w_7的偏導數值,我們就可以按照梯度下降演算法推導的公式,調整這個引數了!


現在,再來看看靠前的引數是怎么調整的,我們以w_1w_6為例

還是老規矩,對照神經網路圖,先寫出它的依賴關系:

可以看出w_1w_6,分別是函式函式h_1h_2的變數,而函式\hat{f_1},\hat{f_2}均與h_1h_2有關,所以Loss函式需要對\hat{f_1},\hat{f_2}均求偏導,

依然按照鏈式求導法則w_1求偏導,有:

w_6求偏導,有:

注意紅框圈出來的部分是不是有些眼熟?

事實上,這一部分已經在調整后層引數的時候計算過了(請回看計算w_7時的計算公式),因此在編程時,可以讓程式保存中間結果,這里直接拿來用,

現在縱觀整個程序,我們驚奇的發現,對于ANN,

當我們需要使用它時,是從最前面給出輸入,然后一步步往后計算得出這個龐大復雜函式的輸出的;

而當我們需要訓練它時,則是從最后面的引數開始,一步步向前求導,調整各個引數的,并且計算前面的引數時一般都會用到之前計算過的中間結果,

這樣,ANN調整引數的程序就可以看作是一個誤差反向傳播(BP)的程序,

之所以會這樣反向傳播,是因為神經網路中靠后的引數依賴的中間變數少、復合層數少,而靠前的引數則經過層層復合,求導鏈會拉的很長,

2.3 最后的一點小問題

以上我們將求偏導的程序整個過了一遍,而求偏導只是梯度下降演算法的一環,

程式跑起來之后,我們會對每一個訓練樣例,一遍遍的求偏導,直到基本上找到極小值點,

也就是說,按照梯度下降演算法,每一個訓練樣例都會最終給出一組引數值,

一個訓練集中顯然會有多個訓練樣例,因此最侄訓得到好多組各不相同的引數值

而ANN的訓練目標是確定一組引數值,得到一個有一定效果的很復雜的函式,

怎么解決?

對每一個引數,我們可以將不同訓練樣例得出的不同值求一個平均,也可以構建一個更大的損失函式,即將每一個訓練樣例生成的損失函式求和,然后用梯度下降演算法找到這個累計損失函式的極小值點,

這樣,我們就能通過訓練,最終確定ANN這個大函式的所有待定引數,然后用它來做一些神奇的事情,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/161694.html

標籤:其他

上一篇:基于FCN的深度學習極化SAR影像處理

下一篇:計算機網路與Java網路編程基礎知識總結

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more