簡介
深層神經網絡(Deep Neural Network,DNN)是一種具有多個隱藏層的神經網絡,它可以用來解決復雜的模式識別和特征學習任務。深層神經網絡在近年來的機器學習和人工智能領域中取得了重大突破,如圖像識別、自然語言處理、語音識別等。
重要概念
多隱藏層:
深層神經網絡具有多個隱藏層,這些隱藏層可以用來提取不同層次的特征。每一層的神經元可以將前一層的輸出作為輸入,并對數據進行更高級的抽象和特征學習。
特征學習:
深層神經網絡通過逐層的特征學習,可以自動地從原始數據中提取出更加抽象和有意義的特征。每一層的權重和偏差都在訓練過程中進行調整,以便更好地捕捉數據中的模式和信息。
非線性激活函數:
深層神經網絡使用非線性的激活函數(如ReLU、Sigmoid、Tanh等)來引入非線性變換,從而使網絡能夠處理更加復雜的關系和模式。
前向傳播和反向傳播:
深層神經網絡的訓練過程包括前向傳播和反向傳播。前向傳播用于計算預測值,并計算損失函數,而反向傳播用于計算梯度并更新權重和偏差,以減小損失函數。
優化算法:
訓練深層神經網絡通常使用各種優化算法,如梯度下降法、隨機梯度下降法、Adam等。這些算法有助于尋找損失函數的最小值,并使網絡的性能逐漸提升。
過擬合問題:
深層神經網絡容易出現過擬合問題,特別是在數據量較少的情況下。為了避免過擬合,常常會采用正則化、Dropout等技術。
深度學習框架:
為了便于搭建和訓練深層神經網絡,許多深度學習框架(如TensorFlow、PyTorch、Keras等)被開發出來,提供了豐富的工具和接口來支持深度神經網絡的構建和訓練。
代碼實現
import numpy as np# Sigmoid 激活函數及其導數
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return x * (1 - x)# 初始化參數
def initialize_parameters(layer_dims):parameters = {}L = len(layer_dims) # 層數for l in range(1, L):parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l - 1]) * 0.01parameters['b' + str(l)] = np.zeros((layer_dims[l], 1))return parameters# 前向傳播
def forward_propagation(X, parameters):caches = []A = XL = len(parameters) // 2 # 神經網絡層數for l in range(1, L):Z = np.dot(parameters['W' + str(l)], A) + parameters['b' + str(l)]A = sigmoid(Z)caches.append((Z, A))Z = np.dot(parameters['W' + str(L)], A) + parameters['b' + str(L)]AL = sigmoid(Z)caches.append((Z, AL))return AL, caches# 計算損失
def compute_loss(AL, Y):m = Y.shape[1]cost = -np.sum(Y * np.log(AL) + (1 - Y) * np.log(1 - AL)) / mreturn cost# 反向傳播
def backward_propagation(AL, Y, caches):grads = {}L = len(caches)m = AL.shape[1]Y = Y.reshape(AL.shape)dAL = - (np.divide(Y, AL) - np.divide(1 - Y, 1 - AL))current_cache = caches[L - 1]dZL = dAL * sigmoid_derivative(current_cache[1])grads['dW' + str(L)] = np.dot(dZL, caches[L - 2][1].T) / mgrads['db' + str(L)] = np.sum(dZL, axis=1, keepdims=True) / mfor l in reversed(range(L - 1)):current_cache = caches[l]dZ = np.dot(parameters['W' + str(l + 2)].T, dZL) * sigmoid_derivative(current_cache[1])grads['dW' + str(l + 1)] = np.dot(dZ, caches[l][1].T) / mgrads['db' + str(l + 1)] = np.sum(dZ, axis=1, keepdims=True) / mdZL = dZreturn grads# 更新參數
def update_parameters(parameters, grads, learning_rate):L = len(parameters) // 2for l in range(L):parameters['W' + str(l + 1)] -= learning_rate * grads['dW' + str(l + 1)]parameters['b' + str(l + 1)] -= learning_rate * grads['db' + str(l + 1)]return parameters# 主函數
def deep_neural_network(X, Y, layer_dims, learning_rate, num_iterations):np.random.seed(42)parameters = initialize_parameters(layer_dims)for i in range(num_iterations):AL, caches = forward_propagation(X, parameters)cost = compute_loss(AL, Y)grads = backward_propagation(AL, Y, caches)parameters = update_parameters(parameters, grads, learning_rate)if i % 100 == 0:print(f'Iteration {i}, Cost: {cost:.4f}')return parameters# 示例數據
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T
Y = np.array([[0, 1, 1, 0]]).T# 定義網絡結構和超參數
layer_dims = [2, 4, 4, 1] # 輸入層維度、隱藏層維度、輸出層維度
learning_rate = 0.1
num_iterations = 10000# 訓練深層神經網絡
parameters = deep_neural_network(X, Y, layer_dims, learning_rate, num_iterations)# 預測
predictions, _ = forward_propagation(X, parameters)
print('Predictions:', predictions)