深度學習 --- stanford cs231學習筆記七(訓練神經網絡之梯度下降優化器)

5,梯度下降優化器

????????

5,1 梯度下降在深度學習中的作用?

? ? ? ? 在深度學習中,權重W的值是否合理是由損失函數L來判斷的。L越小,表示W的設置越happy。L越大,表示W的值越unhappy。?為了讓L越來越小,常用的方法是梯度下降法。

5,2 梯度下降法的基本原理?

? ? ? ? 梯度下降法的原理是基于函數f在點P處的梯度一定是函數f在P點處的所有方向導數中增加最大的方向導數。因此,只要沿著梯度方向移動自變量 x,函數值 f 就會以最快的速度增加。要想讓x沿著梯度方向移動,只需讓自變量x加上梯度。且,不論梯度是正還是負,函數值f都會增加。?

? ? ? ? ?對梯度下降法而言,則正好相反。我們希望盡快找到函數的最小值,以及此時的自變量x。因此,我們應該讓自變量x不斷地朝著梯度的反方向移動,這樣函數值就會很快減小。而讓x沿著梯度的反方向移動的方法,則是讓x減去梯度。

以一元一次函數y=x和y=-x為例:

????????圖中x0表示自變量x的初始位置,紅點表示x0加梯度后的坐標,藍點表示x0減去梯度后的位置。對函數y=x而言,梯度為正1,x0=2加上梯度后會朝著x軸的正向移動,函數值增加。對函數y=-x而言,梯度為負1,x0=0加上梯度后會朝著x軸的反方向移動,函數值還是在增加。

? ? ? ? 對梯度下降法而言,則是希望把x0朝著藍點方向移動。對于兩幅圖中的兩個函數,我同時讓x0減去梯度,得到了圖中的藍點。如果繼續移動,則函數值會越來越低,直到函數的最小值。

? ? ? ?

import numpy as np
import matplotlib.pyplot as plt#y=x
def f(x):return xdef df(x):return 1#y=-x
def ff(x):return -xdef dff(x):return -1x=np.linspace(-np.pi,np.pi,300)#畫y=x
fig,axs=plt.subplots(1,2, figsize=(14, 6))
y=f(x)
axs[0].plot(x,y,label='y=x')
axs[0].set_title('y = x (update x with grad=1)')
axs[0].set_xlabel('x')
axs[0].set_ylabel('y')
axs[0].axhline(0, color='black', linewidth=0.5)
axs[0].axvline(0, color='black', linewidth=0.5)#當前x的位置
x0=2
axs[0].scatter(x0,f(x0),color='black', s=100,label='x0')#沿著函數增加的方向移動x(移動lr個單位的梯度)
#注意我這里是用自變量加梯度
lr=0.5
x1=x0+lr*df(x0)
x2=x0-lr*df(x0)
axs[0].scatter(x1,f(x1),color='red', s=100,label='x0+grad')
axs[0].scatter(x2,f(x2),color='cyan', s=100,label='x0-grad')
axs[0].legend()#畫y=-x
y=ff(x)
axs[1].plot(x,y,label='y=-x')
axs[1].set_title('y = -x (update x with grad=-1)')
axs[1].set_xlabel('x')
axs[1].set_ylabel('y')
axs[1].axhline(0, color='black', linewidth=0.5)
axs[1].axvline(0, color='black', linewidth=0.5)#當前x的位置
x0=0
axs[1].scatter(x0,ff(x0),color='black', s=100,label='x0')#沿著函數增加的方向移動x(移動lr個單位的梯度)
#注意我這里依然是用自變量加梯度
lr=1.5
x1=x0+lr*dff(x0)
x2=x0-lr*dff(x0)
axs[1].scatter(x1,ff(x1),color='red', s=100,label='x0+grad')
axs[1].scatter(x2,ff(x2),color='cyan', s=100,label='x0-grad')
axs[1].legend()

? ? ? ? 如果要以深度學習的損失函數為例,下圖中權重W為自變量,損失函數L(x,W)所對應的梯度如下圖中Grad(L(x,W))所示。現在,為了讓目標函數L(損失函數)的值迅速減小,就要讓自變量W沿著梯度的反方向移動這樣一來,損失函數L的函數值就會迅速減小。即,通過改變自變量W的值,使得函數L的值小于當前值,直至等于0或更小。

? ? ? ? 換句話說,梯度下降法就是要找到能夠令損失函數L的值最小值的W。只不過在找到這一W的過程是循序漸進的(通過調整學習率),并非一蹴而就。

????????下面是我用python寫的一個二元函數的梯度下降法的例子,為了凸顯函數關于某一個維度的變化,即,為了模擬損失函數L(W,x)只關于W去更新,使得損失函數L最小化。我的這個例子是讓二元函數f(x,y)只關于x更新的demo。

import numpy as np
import matplotlib.pyplot as plt#目標函數
def f(x,y):return (x-1)**2+(y-3)**2#目標函數關于x的梯度
def f_prime(x):pfpx=2*(x-1)return pfpx#SGD只針對 x 變量進行梯度下降
def SGD(x0,y0,lr,it):points = [[x0,y0]]#x catchx=x0for _ in range(it):grad=f_prime(x)x-=lr*gradpoints.append([x,y0])return np.array(points)#main
x0=5
y0=5
lr=0.1
it=20points=SGD(x0,y0,lr,it)# 繪制目標函數
x = np.linspace(-3, 7, 400)
y = np.linspace(0, 7, 400)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)#繪制等高線圖
plt.figure(figsize=(10, 6))
plt.contour(X, Y, Z, levels=np.logspace(-1, 3, 20), cmap='jet')# 繪制梯度下降的點
plt.plot(points[:, 0], points[:, 1], 'ro-')# 顯示起點和終點
plt.plot(x0, y0, 'go', label='Starting point')
plt.plot(points[-1, 0], points[-1, 1], 'bo', label='End point')#顯示令原函數為0的點
plt.plot(1,3,'k^',label='f(x,y)=0')# 圖形設置
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gradient Descent Optimization for $f(x, y) = (x - 1)^2 + (y - 3)^2$ (Only updating x)')
plt.legend()
plt.grid(True)
plt.show()# 繪制三維圖像
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surface = ax.plot_surface(X, Y, Z, cmap='RdYlBu', alpha=0.5, edgecolor='none')# 設置視角
ax.view_init(elev=30, azim=100)  # 例如,仰角為30度,方位角為45度# 繪制梯度下降的點
points_z = f(points[:, 0], points[:, 1])
ax.plot(points[:, 0], points[:, 1], points_z, 'ro-', markersize=5, label='Gradient Descent Path')# 顯示起點和終點
ax.scatter(x0, y0, f(x0, y0), color='g', s=100, label='Starting Point')
ax.scatter(points[-1, 0], points[-1, 1], points_z[-1], color='b', s=100, label='End Point')#顯示令原函數為0的點
ax.scatter(1,3,f(1,3),color='k',marker='^',s=100,label='f(x,y)=0')# 添加顏色條
fig.colorbar(surface, shrink=0.5, aspect=10)# 圖形設置
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x, y)')
ax.set_title('Gradient Descent on $f(x, y) = (x - 1)^2 + (y - 3)^2$ (Only updating x)')
ax.legend()
plt.show()

運行結果:?

????????從運行結果中可以看到,因為整個迭代過程只用到了f(x,y)關于x的偏導(限制了y的更新),因此,本來應該沿著令f(x,y)為0的點[x=1,y=3](此時函數值最小等于0)移動的start point,現在只有x方向的移動,即朝著x=1移動。


????????如果能同時更新兩個自變量,則自變量會朝著目標點,即朝著函數值為0的黑三角移動。

?相應的python代碼為:

import numpy as np
import matplotlib.pyplot as plt#目標函數
def f(x,y):return (x-1)**2+(y-3)**2#目標函數關于全部自變量的梯度
def f_prime(x,y):pfpx=2*(x-1)pfpy=2*(y-3)grad=np.array([pfpx,pfpy])return grad#SGD
def SGD(x0,y0,lr,it):points = [[x0,y0]]#x catchx=x0y=y0for _ in range(it):grad=f_prime(x,y)x-=lr*grad[0]y-=lr*grad[1]points.append([x,y])return np.array(points)#main
x0=5
y0=2
lr=0.1
it=20points=SGD(x0,y0,lr,it)# 繪制目標函數
x = np.linspace(-1, 7, 400)
y = np.linspace(-1, 7, 400)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)#繪制等高線圖
plt.figure(figsize=(10, 6))
plt.contour(X, Y, Z, levels=np.logspace(-1, 3, 20), cmap='jet')# 繪制梯度下降的點
plt.plot(points[:, 0], points[:, 1], 'ro-')# 顯示起點和終點
plt.plot(x0, y0, 'go', label='Starting point')
plt.plot(points[-1, 0], points[-1, 1], 'bo', label='End point')#顯示令原函數為0的點
plt.plot(1,3,'k^',label='f(x,y)=0')# 圖形設置
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gradient Descent Optimization for $f(x, y) = (x - 1)^2 + (y - 3)^2$ ')
plt.legend()
plt.grid(True)
plt.show()# 繪制三維圖像
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surface = ax.plot_surface(X, Y, Z, cmap='RdYlBu', alpha=0.5, edgecolor='none')# 設置視角
ax.view_init(elev=30, azim=60)  # 例如,仰角為30度,方位角為45度# 繪制梯度下降的點
points_z = f(points[:, 0], points[:, 1])
ax.plot(points[:, 0], points[:, 1], points_z, 'ro-', markersize=5, label='Gradient Descent Path')# 顯示起點和終點
ax.scatter(x0, y0, f(x0, y0), color='g', s=100, label='Starting Point')
ax.scatter(points[-1, 0], points[-1, 1], points_z[-1], color='b', s=100, label='End Point')#顯示令原函數為0的點
ax.scatter(1,3,f(1,3),color='k',marker='^',s=100,label='f(x,y)=0')# 添加顏色條
fig.colorbar(surface, shrink=0.5, aspect=5)# 圖形設置
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x, y)')
ax.set_title('Gradient Descent on $f(x, y) = (x - 1)^2 + (y - 3)^2$ ')
ax.legend()
plt.show()

5,3?常規梯度下降法的不足之處

? ? ? ? 由于梯度下降法本身就是在不斷地沿著梯度的反方向下降,直到找到最低點。因此,當該點下降到局部最低點時,或者是下降到一個平坦區域時,就無法繼續下降了。而此時所對應的函數值并不是函數的最小值。

例如下面這種情況:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# 目標函數
def f(x, y):return x**4 - 2 * x**2 + y**2# 目標函數關于全部自變量的梯度
def f_prime(x, y):df_dx = 4 * x**3 - 4 * xdf_dy = 2 * yreturn np.array([df_dx, df_dy])# SGD
def SGD(x0, y0, lr, it):points = [[x0, y0]]x, y = x0, y0for _ in range(it):grad = f_prime(x, y)x -= lr * grad[0]y -= lr * grad[1]points.append([x, y])return np.array(points)# 參數設置
x0 = 0
y0 = 1.5
lr = 0.5  # 較大的學習率
it = 30# 執行梯度下降法
points = SGD(x0, y0, lr, it)# 繪制等高線圖
plt.figure(figsize=(10, 6))
x = np.linspace(-2, 2, 400)
y = np.linspace(-2, 2, 400)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
contour=plt.contour(X, Y, Z, levels=np.linspace(-2, 2, 100), cmap='jet')
plt.colorbar(contour, shrink=0.8, extend='both')  # 添加顏色條# 繪制梯度下降的點
plt.plot(points[:, 0], points[:, 1], 'ro-')# 顯示起點和終點
plt.plot(x0, y0, 'go', label='Starting point')
plt.plot(points[-1, 0], points[-1, 1], 'bo', label='End point')# 圖形設置
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gradient Descent Optimization for $f(x, y) = x^4 - 2x^2 + y^2$ with High Learning Rate')
plt.legend()
plt.grid(True)
plt.show()# 繪制三維圖像
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surface = ax.plot_surface(X, Y, Z, cmap='RdYlBu', alpha=0.5)# 繪制梯度下降的點
points_z = f(points[:, 0], points[:, 1])
ax.plot(points[:, 0], points[:, 1], points_z, 'ro-', markersize=5, label='Gradient Descent Path')# 顯示起點和終點
ax.scatter(x0, y0, f(x0, y0), color='g', s=100, label='Starting Point')
ax.scatter(points[-1, 0], points[-1, 1], points_z[-1], color='b', s=100, label='End Point')# 添加顏色條
fig.colorbar(surface, shrink=0.5, aspect=5)# 圖形設置
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x, y)')
ax.set_title('Gradient Descent on $f(x, y) = x^4 - 2x^2 + y^2$ with High Learning Rate')
ax.legend()
plt.show()

這是起始點的選擇不恰當引起的的:?

這是學習率的選擇引起的:


?5,4 SGD+momentum

? ? ? ? 為了克服傳統梯度下降法的缺點,即,碰到local min或saddle points時失效的情況。

????????SGD+Momentum相對于之前的變化在于,原有的SGD是走一步算一步梯度,然后再按這個梯度更新,因此如果走到了局部最小值處或者鞍點,當前點的梯度就為0。梯度為0,就走不下去了,只能在原點大轉。

? ? ? ? SGD+Momentum為了讓點繼續走下去,就引入了“慣性”的概念。具體來說,Momentum在更新時不光考慮當前點的梯度,也會考慮前一步的梯度。也就是在走這一步之前,把上一步的慣性也考慮進去。

? ? ? ? 比如說前面遇到的鞍點或局部最低點,因為按照前一點的梯度去更新,正好走到了這里。但如果前一點所使用的梯度是加上了上上一點的梯度的,也就是加上了慣性,那么這一步就比SGD邁的大,邁的遠。

????????就好像下圖中的黑圈,如果按照SGD的梯度走,則正好走到紅點的位置。但如果加上了上一步的慣性,步子邁的要比SGD大,就能成功的越過局部低點和鞍點繼續往下走。

?對于SGD+Momentum而言,下面兩個公式 是等價的:


5,5 Nesterov Momentum

? ? ? ? ?SGD+Momentum的出現是為了能夠越過局部最低點和鞍點,但有時候如果步子邁的太大也不好,即,沖過頭了。例如,在已經快接近全局最低點的地方,需要反復幾次才能走到最低點,也就是會出現震蕩。

????????Nesterov Momentum的做法是,不再按照當前點的梯度+前一點的梯度去走。而是按照下一步的梯度+前一點的梯度去跟新。

??

????????這樣就能防止步子邁的過大,使初始點在下降的過程中,既能越過鞍點和局部最低點,也能避免震蕩。

小結:

? ? ? ? 不論是SGD+Momentum還是Nesterov Momentum算法都是借助物理中動量的概念設計的算法。下面會介紹一些別的算法如Adagrad, RMSprop和Adam等,他們都屬于自適應算法,通過自適應的調整學習率,處理不同梯度的變化,幫助越過鞍點。


5,6?AdaGrad(Adaptive Gradient Algorithm)

????????AdaGrad(Adaptive Gradient Algorithm)是一種自適應學習率優化算法,它根據歷史的梯度來調整每次的學習率。

? ? ? ? 他的整體思路跟SGD一樣,還是用原始梯度乘以學習率去更新W。所不同的是,他用梯度的平方和的平方根作為對學習率的懲罰(懲罰就是讓學習率除以這個值)去動態的調整學習率。走的步數越多,梯度的平方和就越大,懲罰的就越厲害。?

? ? ? ? 因此,剛開始的時候學習率的衰減小,即步伐大。越是到了后面,學習率的衰減就越來越大,下降的步伐也就會越來越小。這也符合梯度下降的構想,剛開始的時候步伐大,容易越過鞍點和局部小值點,到了后面越是接近全局最小值點了,步子也正好應該小了,免得出現震蕩。


5,7 RMSProp

????????AdaGrad的效果很好,但有一個潛在的問題,也就是他的那個自適應的懲罰項。隨著步數增多,對學習率的懲罰越來越大,這也是我們希望看到了,因為,大概了這個時候已經下降到函數的最低點了。但如果沒有呢?

? ? ? ? 也就是說,如果還沒有走到谷底,對學習率的懲罰就已經很大了呢?這個時候,就好像梯度消失一樣,學習率幾乎為0,w無法更新了。相當于是眼看著就要到谷底了,卻腳崴了,走不動道了。因此,RMSProp就對AdaGrad的這一問題進行了改進。

? ? ? ? 在grad_sqared的計算中RMSProp加入了一個系數decay_rate。根據公式可以看出,當decay_rate為0時,RMSProp就退化成了AdaGrad算法,此時學習率的懲罰項依然是梯度的平方和開根號。當decay_rate為1時,每一步學習率的懲罰項都等于當前梯度的平方根,即只與當前梯度有關。

? ? ? ? 這也就是說,隨著decay_rate這個參數從0逐漸增加到1,對學習率的懲罰也越來越弱。這樣就能避免步數太多了以后崴腳的情況。


(全文完)?

--- 作者,松下J27

?參考文獻(鳴謝):?

1,Stanford University CS231n: Deep Learning for Computer Vision

2,訓練神經網絡(第二部分)_嗶哩嗶哩_bilibili

3,10 Training Neural Networks I_嗶哩嗶哩_bilibili

4,Schedule | EECS 498-007 / 598-005: Deep Learning for Computer Vision?

版權聲明:所有的筆記,可能來自很多不同的網站和說明,在此沒法一一列出,如有侵權,請告知,立即刪除。歡迎大家轉載,但是,如果有人引用或者COPY我的文章,必須在你的文章中注明你所使用的圖片或者文字來自于我的文章,否則,侵權必究。 ----松下J27?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37266.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37266.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos7安裝zabbix6.4-mysql8

CentOS 7 安裝 Zabbix 6.4 步驟 關閉防火墻和服務 systemctl stop firewalld.service setenforce 0安裝 MySQL 配置 MySQL 源 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm yum -y install mysql80-community-release-el7-5.noarch.rpm安裝 M…

句法分析概述

第1關:句法分析概述 任務描述 本關任務:通過對句法分析基本概念的學習,完成相應的選擇題。 相關知識 為了完成本關任務,你需要掌握: 句法分析的基礎概念; 句法分析的數據集和評測方法。 句法分析簡介…

應用及安全

目錄 一、PAM 安全認證及配置 1.1配置 su 命令的認證 1.2PAM 配置文件結構二、賬號和密碼安全管理 2.1賬號管理 2.2系統賬號清理 2.3密碼安全控制 2.4密碼重設示例 2.5參考命令三、命令歷史限制 3.1設置命令歷史記錄…

【問chatgpt】

這采用的是什么腳手架初始化的?這樣問詢chatgpt 從文件結構來看,這個項目很可能是使用 Express 框架初始化的。這些文件夾和命名約定常見于 Express 項目結構,特別是: controllers: 控制器文件夾,通常用于處理請求邏…

同城小商城貨到付款系統源碼小程序

:便捷購物新選擇 🚀 一、快速便捷,同城直達 在這個快節奏的時代,時間就是金錢。你是否曾因為等待快遞而焦慮不安?現在,有了“同城商城貨到付款小程序”,這一切都變得不再是問題。它專注于同城…

<商務世界>《79 微課堂 <客戶是核心:2 客戶溝通的技巧《揚長避短進行溝通》(全文原創首發)>》

1 說明 符合表示★關鍵信息▲必要信息●一般信息 2 規則 等級信息★1、無準備,不溝通。▲2、做最準備充分,準備不設上限★3、掌握自己的節奏,不在他人節參中被動●4、準備充分、心態平穩、揚長避短。●5、溝通就是對消息的處理。發送、接收…

谷歌如何進行失效鏈接建設?

失效鏈接建設是一種高效的外鏈建設策略,通過發現并利用失效鏈接來提升自己網站的SEO。以下是詳細的步驟: 尋找失效頁面:你需要使用SEO工具,如Ahrefs,來查找與你的網站內容相關的失效頁面。這些頁面可能是競爭對手的失…

傳神社區|數據集合集第4期|中文NLP數據集合集

自從ChatGPT等大型語言模型(Large Language Model, LLM)出現以來,其類通用人工智能(AGI)能力引發了自然語言處理(NLP)領域的新一輪研究和應用浪潮。尤其是ChatGLM、LLaMA等普通開發者都能運行的…

基于深度學習的相機內參標定

基于深度學習的相機內參標定 相機內參標定(Camera Intrinsic Calibration)是計算機視覺中的關鍵步驟,用于確定相機的內部參數(如焦距、主點位置、畸變系數等)。傳統的標定方法依賴于已知尺寸的標定板,通常…

一文弄懂線性回歸模型

1、引言 今天,我們將深入探討機器學習中的三個關鍵概念:線性回歸、代價函數和梯度下降。這些概念構成了許多機器學習算法的基礎。起初,我決定不寫一篇關于這些主題的文章,因為它們已經被廣泛涉及。不過,我改變了主意&…

[圖解]SysML和EA建模住宅安全系統-02-現有運營領域-塊定義圖

1 00:00:00,840 --> 00:00:02,440 首先我們來看畫在哪里 2 00:00:02,570 --> 00:00:08,310 你看,這是圖的類型,圖里面內容 3 00:00:08,320 --> 00:00:10,780 這是元素類型 4 00:00:10,790 --> 00:00:14,900 這是位置,哪個包 …

Halcon 文本文件操作,形態學

一文件的讀寫 *******************************************************向文本文件寫入字符串內容*************************************************************read_image (Image, fabrik)threshold (Image, Region, 0, 120)area_center (Region, Area, Row, Column)open_…

【前端面試題】vue2.0與vue3.0不同處大全

Vue 3.0與Vue 2.0在細節上存在多個顯著的不同之處,以下是對這些區別的詳細歸納和解釋: 性能提升: Vue 3.0的性能相比Vue 2.x快了1.2至2倍。這主要得益于內部對虛擬DOM的完全重寫,mounting和patching的提速,以及基于Pr…

嘉立創學習

1.兩個設置,一般用左邊那個 2.焊盤分類 基本焊盤 熱風盤:也叫花焊盤(負片) 隔離焊盤:外面那圈黑色,用作隔離(負片) 鋼網層:(錫膏) 阻焊層&…

【php】【mysql】【layui】 原生初級簡易留言簿系統成品代碼動態網站開發網頁WEB瀏覽器端B/S結構

更多項目點擊👆👆👆完整項目成品專欄 【php】【mysql】【layui】 原生初級簡易留言簿系統成品代碼動態網站開發網頁WEB瀏覽器端B/S結構 獲取源碼方式項目說明:文件包含:項目運行環境項目運行截圖 獲取源碼方式 加Q群…

妙解設計模式之橋接模式

橋接模式的概念 橋接模式(Bridge Pattern)是一種結構型設計模式,用于將抽象部分和實現部分分離,使它們可以獨立變化。這種模式通過組合而不是繼承來實現這個目標,從而提高系統的靈活性和可擴展性。 抽象部分&#xf…

如何使用C++進行文件讀寫操作

在C中&#xff0c;我們可以使用標準庫中的 <fstream>&#xff08;文件流&#xff09;來進行文件的讀寫操作。以下是一些基本的文件讀寫操作的示例。 讀取文件 cpp復制代碼 #include <fstream> #include <iostream> #include <string> int main() { s…

MySQL高級-SQL優化- update 優化(盡量根據主鍵/索引字段進行數據更新,避免行鎖升級為表鎖)

文章目錄 0、update 優化1、創建表2、默認是行鎖3、行鎖升級為表鎖4、給name字段建立索引 0、update 優化 InnoDB的行鎖是針對索引加的鎖&#xff0c;不是針對記錄加的鎖&#xff0c;并且該索引不能失效&#xff0c;否則會從行鎖升級為表鎖。 1、創建表 create table course(…

【嚴正聲明】鑒于CSDN的流氓行為,現已清空所有文章,資源下載分統一改為0

【嚴正聲明】鑒于CSDN的流氓行為&#xff0c;現已清空所有文章&#xff0c;資源下載分統一改為0 鑒于CSDN的流氓行為&#xff0c;現已清空所有文章&#xff0c;資源下載分統一改為0 鑒于CSDN的流氓行為&#xff0c;現已清空所有文章&#xff0c;資源下載分統一改為0 如果你在C…

CUDA 編程

## blocksize和gridsize設置 使用deviceQuery查看GPU相關信息(下圖為1080 ti)blocksize的最大值建議不要超過Maximum number of threads per block&#xff08;1024&#xff09;由于每個block里的線程需要被分為數個wrap&#xff0c;而wrap size為32&#xff08;Warp size&…