<jupyter_start><jupyter_text>先程は$f(x_1,x_2)=x_1^2 + x_2^2$の最小化を行いましたが、以下の関数(Rosenbrock function)を最小化してみましょう。$$f(x_1,x_2)=(1-x_1)^2 + 100(x_2-x_1^2)^2$$この関数は$(x_1,x_2)=(1, 1)$で最小値を取ります。微分は$$\begin{align*}\frac{\partial f}{\partial x_1} &= -2(1-x_1) - 400(x_2-x_1^2)x_1 \\\frac{\partial f}{\partial x_2} &= 200(x_2-x_1^2) \\\end{align*}$$となります。これを最急降下法(GD)で最小化すると、<jupyter_code># 目的関数の等高線プロット
x1, x2 = np.meshgrid(np.linspace(-0.8, 1.2, num=100), np.linspace(-0.1, 1.1, num=100))
y = np.square(1-x1) + 100 * np.square(x2-np.square(x1))  # Rosenbrock関数
plt.contour(x1, x2, np.log(y), linestyles='dashed', levels=10)  # 見やすさのため、z軸をlog-scaleにしています

x1History = []
x2History = []

x1 = -0.5  # 初期値
x2 = 0.5  # 初期値
x1History.append(x1)
x2History.append(x2)

# 最適化
learning_rate = 0.005  # ステップ幅
num_steps = 100  # 繰り返し回数
for i in range(num_steps):
    # 一次微分
    grad_x1 = -2 * (1 - x1) - 400 * (x2 - x1 * x1) * x1
    grad_x2 = 200 * (x2 - x1 * x1)

    # Gradient  descent
    x1 = x1 - learning_rate * grad_x1
    x2 = x2 - learning_rate * grad_x2

    x1History.append(x1)
    x2History.append(x2)

# 更新値履歴のプロット
plt.plot(x1History, x2History,
         color='black',
         marker='o', markersize=5, markerfacecolor='None', markeredgecolor='black')  # プロット
plt.xlabel('x1')
plt.ylabel('x2')
plt.xlim([-0.8, 1.2])
plt.ylim([-0.1, 1.1])
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.20014556040756915, 'fraction_numerical': 0.09243085880640466, 'mean_word_length': 4.07380073800738, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '62092', 'license': 'Apache-2.0', 'n_tokens_mistral': 814, 'n_tokens_neox': 757, 'n_words': 98, 'path': 'Optimization.ipynb', 'repo_name': 'saitoicepp/DeepLearningTutorial2020', 'size': '1374'}