{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 10wk-2: 추천시스템 (1) – optimizer 사용 고급, MF-based 추천시스템\n", "\n", "최규빈 \n", "2024-05-08\n", "\n", "\n", "\n", "# 1. 강의영상\n", "\n", "\n", "\n", "# 2. Imports" ], "id": "2dbe8113-0607-4c99-90ea-8a96f365b985" }, { "cell_type": "code", "execution_count": 899, "metadata": { "tags": [] }, "outputs": [], "source": [ "import torch\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ], "id": "be01850b-e0ed-45be-a675-799d9c90c0ee" }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3. 예비학습: optimizer 사용 고급\n", "\n", "`-` 주어진 자료가 아래와 같다고 하자." ], "id": "33528afd-a444-42c1-81c5-f72ca80e2114" }, { "cell_type": "code", "execution_count": 900, "metadata": { "tags": [] }, "outputs": [], "source": [ "torch.manual_seed(43052)\n", "x,_ = torch.randn(100).sort()\n", "x = x.reshape(-1,1)\n", "ones= torch.ones(100).reshape(-1,1)\n", "X = torch.concat([ones,x],axis=-1)\n", "ϵ = torch.randn(100).reshape(-1,1)*0.5\n", "y = 2.5+ 4*x + ϵ" ], "id": "edb6a36c-9916-471a-ad39-bd823f40eccf" }, { "cell_type": "code", "execution_count": 901, "metadata": { "tags": [] }, "outputs": [ { "output_type": "display_data", "metadata": {}, "data": { "image/png": "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\n3pwNAAAAAElFTkSuQmCC\n" } } ], "source": [ "plt.plot(x,y,'o')" ], "id": "2d8460b3-f0aa-4443-9622-b8acb662e46a" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 문제1: 아래와 같이 최초의 직선을 생성하였다." ], "id": "dd18b72d-33b6-4621-af09-118cce3d1e9d" }, { "cell_type": "code", "execution_count": 902, "metadata": { "tags": [] }, "outputs": [], "source": [ "What = torch.tensor([[-5.0],[10.0]],requires_grad=True)" ], "id": "1e3993d0-9fd3-4fb4-a059-a7676f282d15" }, { "cell_type": "code", "execution_count": 905, "metadata": { "tags": [] }, "outputs": [ { "output_type": "display_data", "metadata": {}, "data": { "image/png": "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\nYc+ePXVe0759e5KSkmqc//nnn8nOzmblypXk5eVx3333sWDBAr788suqa/bt20daWhpLly6lX79+\nNd6jtLSU0tLSquPi4mKys7ODM2dFREREgsKXOSs+91lJT08nPT3dr8Iqc1Fl2MjLy+Ohhx6ioKCA\nrKwsABYvXozdbqdbN889TOx2O3a73a/PFxERkcgTtKZwa9asYc2aNfTu3ZvmzZvz448/ct9999Gh\nQwfy8vIAGDBgAJ07d2bkyJFMmzaNoqIi7rjjDsaMGaNREhEREQGCOME2OTmZ+fPnc8EFF3DyySdz\n3XXXkZuby7Jly6pGRuLj41m4cCFJSUn06tWL3/zmNwwbNozp06cHqywRERGJMCHtsxIMQe2zIiIi\nIkERln1WRERERPyhsCIiIiJhTWFFREREwprCioiIiIQ1hRUREREJaworIiIiEtYUVkRERCSsKayI\niIhIWAtau/1QqexpV1xcbHElIiIi4q3K721vetNGfFg5cOAAANnZ2RZXIiIiIr46cOAADoejzmsi\nvt2+2+1m586dpKSkYLPZrC7HEsXFxWRnZ7Njxw5tORAE+v0Gj363waXfb/Dod9twhmFw4MABWrdu\nTVxc3bNSIn5kJS4ujrZt21pdRlhITU3VX5og0u83ePS7DS79foNHv9uGqW9EpZIm2IqIiEhYU1gR\nERGRsKawEgXsdjv3338/drvd6lKikn6/waPfbXDp9xs8+t2GVsRPsBUREZHoppEVERERCWsKKyIi\nIhLWFFZEREQkrCmsiIiISFhTWIki27dv5/rrrycnJ4fk5GQ6dOjA/fffT1lZmdWlRY2HHnqInj17\n0rhxY5o1a2Z1ORHv6aefJicnh6SkJLp168Ynn3xidUlRYfny5QwdOpTWrVtjs9l4++23rS4pakyZ\nMoXu3buTkpJCq1atGDZsGN9++63VZUU9hZUo8s033+B2u5k1axabN2/mscce45lnnuGee+6xurSo\nUVZWxogRI7j55putLiXivfrqq0ycOJF7772XL774gvPOO49BgwaRn59vdWkRr6SkhDPPPJMZM2ZY\nXUrUWbZsGePHj2f16tUsWbKEiooKBgwYQElJidWlRTUtXY5y06ZNY+bMmfz4449WlxJV5s6dy8SJ\nE9m/f7/VpUSsc845h65duzJz5syqc6eeeirDhg1jypQpFlYWXWw2G2+99RbDhg2zupSotHv3blq1\nasWyZcs4//zzrS4namlkJco5nU7S0tKsLkOkmrKyMtatW8eAAQOqnR8wYAArV660qCoR3zmdTgD9\nOxtkCitRbOvWrTz55JOMHTvW6lJEqtmzZw8ul4uMjIxq5zMyMigsLLSoKhHfGIbB7bffTu/evcnN\nzbW6nKimsBIBJk+ejM1mq/Oxdu3aaq/ZuXMnF198MSNGjOCGG26wqPLI4M/vVwLDZrNVOzYMo8Y5\nkXA1YcIENm7cyMsvv2x1KVGvkdUFSP0mTJjAVVddVec17du3r/p5586d9OvXj7y8PJ599tkgVxf5\nfP39SsOlp6cTHx9fYxRl165dNUZbRMLRLbfcwjvvvMPy5ctp27at1eVEPYWVCJCenk56erpX1/7y\nyy/069ePbt26MWfOHOLiNHhWH19+vxIYiYmJdOvWjSVLlnD55ZdXnV+yZAmXXXaZhZWJ1M0wDG65\n5RbeeustPv74Y3JycqwuKSYorESRnTt30rdvX9q1a8f06dPZvXt31XOZmZkWVhY98vPzKSoqIj8/\nH5fLxYYNGwDo2LEjTZs2tba4CHP77bczcuRIzj777KpRwPz8fM2xCoCDBw/yww8/VB1v27aNDRs2\nkJaWRrt27SysLPKNHz+eefPmsWDBAlJSUqpGBx0OB8nJyRZXF8UMiRpz5swxAI8PCYxRo0Z5/P1+\n9NFHVpcWkZ566injhBNOMBITE42uXbsay5Yts7qkqPDRRx95/P/TUaNGWV1axKvt39g5c+ZYXVpU\nU58VERERCWua0CAiIiJhTWFFREREwprCioiIiIQ1hRUREREJaworIiIiEtYUVkRERCSsKayIiIhI\nWFNYERERkbCmsCIiIiJhTWFFREREwprCioiIiIQ1hRUREREJa/8fUYcY72NbhHMAAAAASUVORK5C\nYII=\n" } } ], "source": [ "plt.plot(x,y,'o')\n", "plt.plot(x,X@What.data,'--')" ], "id": "67efcd37-16e7-4b23-b557-709d07dfe2ed" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`torch.optim.SGD`를 이용하여 What을 update하라. 학습률은 0.1로 설정하고\n", "30회 update하라." ], "id": "2a63216d-115c-40ff-8112-44964eeffbf2" }, { "cell_type": "code", "execution_count": 906, "metadata": { "tags": [] }, "outputs": [], "source": [ "# net \n", "loss_fn = torch.nn.MSELoss()\n", "optimizr = torch.optim.SGD([What],lr=0.1)\n", "#--#\n", "for epoc in range(30):\n", " # step1 \n", " yhat = X@What \n", " # step2\n", " loss = loss_fn(yhat,y)\n", " # step3 \n", " loss.backward()\n", " # step4 \n", " optimizr.step()\n", " optimizr.zero_grad()" ], "id": "433f3106-c080-41bf-8a08-658c7ccd02fb" }, { "cell_type": "code", "execution_count": 907, "metadata": { "tags": [] }, "outputs": [ { "output_type": "display_data", "metadata": {}, "data": { "image/png": "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\n" } } ], "source": [ "plt.plot(x,y,'o')\n", "plt.plot(x,X@What.data,'--')" ], "id": "72c77594-0730-40c4-9ef1-45121d3c3c0c" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 문제2: 아래와 같이 최초의 직선을 생성하였다." ], "id": "7f268a8d-1e7c-453f-a020-6ce7ea855a39" }, { "cell_type": "code", "execution_count": 919, "metadata": { "tags": [] }, "outputs": [], "source": [ "w = torch.tensor(10.0,requires_grad=True)\n", "b = torch.tensor(-5.0,requires_grad=True)" ], "id": "28923c4e-2a2f-4e3f-93ec-03a071bc4b0a" }, { "cell_type": "code", "execution_count": 920, "metadata": { "tags": [] }, "outputs": [ { "output_type": "display_data", "metadata": {}, "data": { "image/png": "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\nYc+ePXVe0759e5KSkmqc//nnn8nOzmblypXk5eVx3333sWDBAr788suqa/bt20daWhpLly6lX79+\nNd6jtLSU0tLSquPi4mKys7ODM2dFREREgsKXOSs+91lJT08nPT3dr8Iqc1Fl2MjLy+Ohhx6ioKCA\nrKwsABYvXozdbqdbN889TOx2O3a73a/PFxERkcgTtKZwa9asYc2aNfTu3ZvmzZvz448/ct9999Gh\nQwfy8vIAGDBgAJ07d2bkyJFMmzaNoqIi7rjjDsaMGaNREhEREQGCOME2OTmZ+fPnc8EFF3DyySdz\n3XXXkZuby7Jly6pGRuLj41m4cCFJSUn06tWL3/zmNwwbNozp06cHqywRERGJMCHtsxIMQe2zIiIi\nIkERln1WRERERPyhsCIiIiJhTWFFREREwprCioiIiIQ1hRUREREJaworIiIiEtYUVkRERCSsKayI\niIhIWAtau/1QqexpV1xcbHElIiIi4q3K721vetNGfFg5cOAAANnZ2RZXIiIiIr46cOAADoejzmsi\nvt2+2+1m586dpKSkYLPZrC7HEsXFxWRnZ7Njxw5tORAE+v0Gj363waXfb/Dod9twhmFw4MABWrdu\nTVxc3bNSIn5kJS4ujrZt21pdRlhITU3VX5og0u83ePS7DS79foNHv9uGqW9EpZIm2IqIiEhYU1gR\nERGRsKawEgXsdjv3338/drvd6lKikn6/waPfbXDp9xs8+t2GVsRPsBUREZHoppEVERERCWsKKyIi\nIhLWFFZEREQkrCmsiIiISFhTWIki27dv5/rrrycnJ4fk5GQ6dOjA/fffT1lZmdWlRY2HHnqInj17\n0rhxY5o1a2Z1ORHv6aefJicnh6SkJLp168Ynn3xidUlRYfny5QwdOpTWrVtjs9l4++23rS4pakyZ\nMoXu3buTkpJCq1atGDZsGN9++63VZUU9hZUo8s033+B2u5k1axabN2/mscce45lnnuGee+6xurSo\nUVZWxogRI7j55putLiXivfrqq0ycOJF7772XL774gvPOO49BgwaRn59vdWkRr6SkhDPPPJMZM2ZY\nXUrUWbZsGePHj2f16tUsWbKEiooKBgwYQElJidWlRTUtXY5y06ZNY+bMmfz4449WlxJV5s6dy8SJ\nE9m/f7/VpUSsc845h65duzJz5syqc6eeeirDhg1jypQpFlYWXWw2G2+99RbDhg2zupSotHv3blq1\nasWyZcs4//zzrS4namlkJco5nU7S0tKsLkOkmrKyMtatW8eAAQOqnR8wYAArV660qCoR3zmdTgD9\nOxtkCitRbOvWrTz55JOMHTvW6lJEqtmzZw8ul4uMjIxq5zMyMigsLLSoKhHfGIbB7bffTu/evcnN\nzbW6nKimsBIBJk+ejM1mq/Oxdu3aaq/ZuXMnF198MSNGjOCGG26wqPLI4M/vVwLDZrNVOzYMo8Y5\nkXA1YcIENm7cyMsvv2x1KVGvkdUFSP0mTJjAVVddVec17du3r/p5586d9OvXj7y8PJ599tkgVxf5\nfP39SsOlp6cTHx9fYxRl165dNUZbRMLRLbfcwjvvvMPy5ctp27at1eVEPYWVCJCenk56erpX1/7y\nyy/069ePbt26MWfOHOLiNHhWH19+vxIYiYmJdOvWjSVLlnD55ZdXnV+yZAmXXXaZhZWJ1M0wDG65\n5RbeeustPv74Y3JycqwuKSYorESRnTt30rdvX9q1a8f06dPZvXt31XOZmZkWVhY98vPzKSoqIj8/\nH5fLxYYNGwDo2LEjTZs2tba4CHP77bczcuRIzj777KpRwPz8fM2xCoCDBw/yww8/VB1v27aNDRs2\nkJaWRrt27SysLPKNHz+eefPmsWDBAlJSUqpGBx0OB8nJyRZXF8UMiRpz5swxAI8PCYxRo0Z5/P1+\n9NFHVpcWkZ566injhBNOMBITE42uXbsay5Yts7qkqPDRRx95/P/TUaNGWV1axKvt39g5c+ZYXVpU\nU58VERERCWua0CAiIiJhTWFFREREwprCioiIiIQ1hRUREREJaworIiIiEtYUVkRERCSsKayIiIhI\nWFNYERERkbCmsCIiIiJhTWFFREREwprCioiIiIQ1hRUREREJa/8fUYcY72NbhHMAAAAASUVORK5C\nYII=\n" } } ], "source": [ "plt.plot(x,y,'o')\n", "plt.plot(x,(x*w + b).data,'--')" ], "id": "5e117e2b-9916-4f4d-a669-7b76c409f189" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`torch.optim.SGD`를 이용하여 What을 update하라. 학습률은 0.1로 설정하고\n", "30회 update하라." ], "id": "bb104f2e-03b0-4b04-9e85-e96d6e96a3e9" }, { "cell_type": "code", "execution_count": 922, "metadata": { "tags": [] }, "outputs": [], "source": [ "# net \n", "loss_fn = torch.nn.MSELoss()\n", "optimizr = torch.optim.SGD([w,b],lr=0.1)\n", "#--#\n", "for epoc in range(30):\n", " # step1 \n", " yhat = x*w+b \n", " # step2\n", " loss = loss_fn(yhat,y)\n", " # step3 \n", " loss.backward()\n", " # step4 \n", " optimizr.step()\n", " optimizr.zero_grad()" ], "id": "82f678fe-49e6-423c-b303-e67ac681a764" }, { "cell_type": "code", "execution_count": 923, "metadata": { "tags": [] }, "outputs": [ { "output_type": "display_data", "metadata": {}, "data": { "image/png": "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\nEREREWllMdfQLCcrnZGZdnVWFRERiQAxF0TAvUwzpG+XcA9DREQk5sXU0oyIiIhEFgURERERCRsF\nEREREQkbBREREREJGwURERERCRsFEREREQkbBREREREJGwURERERCRsFEREREQmbiO6sapomAA6H\nI8wjERERkUB5fm97fo/7E9FBZO/evQD07NkzzCMRERGRYO3duxebzeb3HsMMJK6EicvlYvv27SQn\nJ2MYsXkoncPhoGfPnmzdupWUlJRwDyfq6OcbOvrZhpZ+vqGln2/zmKbJ3r176d69OxaL/yqQiJ4R\nsVgs9OjRI9zDiAgpKSn6hyGE9PMNHf1sQ0s/39DSz7fpGpsJ8VCxqoiIiISNgoiIiIiEjYJIhEtM\nTGTq1KkkJiaGeyhRST/f0NHPNrT08w0t/XxbT0QXq4qIiEh004yIiIiIhI2CiIiIiISNgoiIiIiE\njYKIiIiIhI2CSBvx448/cu2115KRkUG7du3o27cvU6dOpbKyMtxDixoPPfQQQ4cOpX379nTq1Cnc\nw2nzXnjhBTIyMkhKSmLgwIF8+umn4R5SVFi2bBmjRo2ie/fuGIbB3Llzwz2kqDF9+nROOukkkpOT\n6datG2PHjuW7774L97CinoJIG/G///0Pl8vFiy++yIYNG3j66aeZOXMmd999d7iHFjUqKyu59NJL\nmThxYriH0ua99dZb3HLLLdxzzz18+eWXnHbaaZx77rls2bIl3ENr88rKyhgwYAAzZswI91Cizief\nfMKNN97IqlWrWLx4MdXV1Zx99tmUlZWFe2hRTdt327DHH3+cvLw8Nm/eHO6hRJXXXnuNW265hT17\n9oR7KG3W4MGDyc7OJi8vr+baMcccw9ixY5k+fXoYRxZdDMPgvffeY+zYseEeSlTauXMn3bp145NP\nPuH0008P93CilmZE2rDS0lJSU1PDPQyROiorK1mzZg1nn312netnn302K1asCNOoRIJXWloKoH/P\nhpiCSBu1adMmnnvuOSZMmBDuoYjUsWvXLpxOJ2lpaXWup6WlUVRUFKZRiQTHNE1uu+02Tj31VLKy\nssI9nKimIBJm06ZNwzAMv3+++OKLOs9s376dnJwcLr30Uq677rowjbxtaMrPV1qGYRh1Xpum2eCa\nSKSaNGkSX3/9NXPmzAn3UKJeXLgHEOsmTZrE5Zdf7veePn361Pz19u3bGTZsGEOGDOGll14K8eja\nvmB/vtJ8Xbt2xWq1Npj92LFjR4NZEpFIdNNNNzF//nyWLVtGjx49wj2cqKcgEmZdu3ala9euAd27\nbds2hg0bxsCBA5k1axYWiya0GhPMz1daRkJCAgMHDmTx4sVceOGFNdcXL17MmDFjwjgyEf9M0+Sm\nm27ivffe4+OPPyYjIyPcQ4oJCiJtxPbt2znzzDPp1asXTzzxBDt37qx5z263h3Fk0WPLli2UlJSw\nZcsWnE4n69atA+DII4+kY8eO4R1cG3Pbbbdx1VVXceKJJ9bM3m3ZskU1TS1g3759bNy4seZ1QUEB\n69atIzU1lV69eoVxZG3fjTfeyBtvvMG8efNITk6umdWz2Wy0a9cuzKOLYqa0CbNmzTIBr3+kZVx9\n9dVef74fffRRuIfWJj3//PNm7969zYSEBDM7O9v85JNPwj2kqPDRRx95/d/p1VdfHe6htXm+/h07\na9ascA8tqqmPiIiIiISNigxEREQkbBREREREJGwURERERCRsFEREREQkbBREREREJGwURERERCRs\nFEREREQkbBREREREJGwURERERCRsFEREREQkbBREREREJGwURERERCRs/h9OFLhYdc9+SwAAAABJ\nRU5ErkJggg==\n" } } ], "source": [ "plt.plot(x,y,'o')\n", "plt.plot(x,(x*w + b).data,'--')" ], "id": "2ca7cd7a-890d-4321-ba9c-8a86f29573ee" }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4. MF-based 추천시스템\n", "\n", "ref: \n", "\n", "## A. Data: 나는 SOLO\n", "\n", "`-` Data" ], "id": "680bb731-6296-495d-b5d2-b07419001022" }, { "cell_type": "code", "execution_count": 458, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_view = pd.read_csv('https://raw.githubusercontent.com/guebin/DL2024/main/posts/solo.csv',index_col=0)\n", "df_view" ], "id": "9ad42043-cdba-46a1-92f0-51aa4ce6e161" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 데이터를 이해할 때 필요한 가정들 – 제가 마음대로 설정했어요..\n", "\n", "- 궁합이 잘맞으면 5점, 잘 안맞으면 0점 이다.\n", "- MBTI 성향에 따라서 궁함의 정도가 다르다. 특히 I/E의 성향일치가\n", " 중요하다.\n", "- 하니는 모든 사람들과 대체로 궁합이 잘 맞는다.\n", "- 하니는 I성향의 사람들과 좀 더 잘 맞는다.\n", "\n", "## B. Fit / Predict\n", "\n", "`-` 목표: NaN을 추정\n", "\n", "`-` 수동추론: 그럴듯한 숫자를 추정해보자.\n", "\n", "- 옥순(IN),영식(IN)의 궁합은? $\\to$ 둘다 IN 이므로 잘 맞을듯 $\\to$ 4.0\n", " 정도?\n", "- 영자(IN),다호(ES)의 궁합은? $\\to$ 잘 안맞을듯\n", "- 하니(I),영호(IS)의 궁합은? $\\to$ 하니는 모두 좋아하므로 기본적으로\n", " 4.5 정도 + 하니는 I성향이므로 더 잘 맞을듯 $\\to$ 거의 4.9 아닐까?\n", "\n", "`-` 좀 더 체계적인 추론 전략: (1) 사람들이 가지고 있는 성향 (2)\n", "사람자체의 절대매력을 수치화 하자.\n", "\n", "- 옥순(IN)의 IN성향, 옥순(IN)의 매력 = (1.22, 0.49), 1.21\n", "- 영식(IN)의 IN성향, 영식(IN)의 매력 = (1.20, 0.50), 1.20\n", "- 영자(IN)의 IN성향, 영자(IN)의 매력 = (1.17 ,0.44), 1.25\n", "- 다호(ES)의 IN성향, 다호(ES)의 매력 = (-1.22 ,-0.60), 1.15\n", "- 하니(I)의 IN성향, 하니(I)의 매력 = (0.20,0.00), 3.60\n", "- 영호(IS)의 IS성향, 영호(IS)의 매력 = (1.23 , -0.7), 1.11\n", "\n", "**(1)** 옥순(IN)과 영식(IN)의 궁합 $\\approx$\n", "옥순의I성향$\\times$영식의I성향 $+$ 옥순의N성향$\\times$영식의N성향 $+$\n", "옥순의매력 $+$ 영식의매력" ], "id": "e401c620-bde0-49d6-84f0-0d77a8854c65" }, { "cell_type": "code", "execution_count": 1107, "metadata": { "tags": [] }, "outputs": [], "source": [ "옥순성향 = torch.tensor([1.22,0.49]).reshape(1,2)\n", "옥순매력 = torch.tensor(1.21)\n", "영식성향 = torch.tensor([1.20,0.5]).reshape(1,2)\n", "영식매력 = torch.tensor(1.2)\n", "((옥순성향*영식성향).sum() + 옥순매력 + 영식매력) # 옥순과 영식의 궁합: a ∘ b 로 내적구함 + 이후에 매력을 더함 \n", "(옥순성향 @ 영식성향.T + 옥순매력 + 영식매력) # 옥순과 영식의 궁합: a.T @ b 로 내적구함 + 이후에 매력을 더함" ], "id": "96e2b6fb-9dea-432e-bd1a-3ee34975a5ff" }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(2)** 영자(IN)와 다호(ES)의 궁합 $\\approx$ 영자I성향$\\times$다호I성향\n", "$+$ 영자N성향$\\times$다호의N성향 $+$ 영자의매력 $+$ 다호의매력" ], "id": "b8ac9426-205c-4975-94bd-35ce8483547c" }, { "cell_type": "code", "execution_count": 1109, "metadata": { "tags": [] }, "outputs": [], "source": [ "영자성향 = torch.tensor([1.17,0.44]).reshape(1,2)\n", "영자매력 = torch.tensor(1.25).reshape(1,1)\n", "다호성향 = torch.tensor([-1.22,-0.6]).reshape(1,2)\n", "다호매력 = torch.tensor(1.15).reshape(1,1)\n", "((영자성향*다호성향).sum() + 영자성향 + 다호성향)\n", "(영자성향 @ 다호성향.T + 영자매력 + 다호매력)" ], "id": "5d7b2b4e-f216-4717-8b38-4815faefa8e4" }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(3)** 하니(I)와 영호(IS)의 궁합 $\\approx$ 하니I성향$\\times$영호I성향\n", "$+$ 하니N성향$\\times$영호의N성향 $+$ 하니의매력 $+$ 영호의매력" ], "id": "2311657c-8158-4568-abf9-a3ed96cae08a" }, { "cell_type": "code", "execution_count": 1110, "metadata": { "tags": [] }, "outputs": [], "source": [ "하니성향 = torch.tensor([0.2,0]).reshape(1,2)\n", "하니매력 = torch.tensor(3.6)\n", "영호성향 = torch.tensor([1.23,-0.7]).reshape(1,2)\n", "영호매력 = torch.tensor(1.11)\n", "((하니성향*영호성향).sum() + 하니매력 + 영호매력)\n", "(하니성향 @ 영호성향.T + 하니매력 + 영호매력)" ], "id": "bb540bcb-f518-463f-a47d-29d4d3e70e63" }, { "cell_type": "markdown", "metadata": {}, "source": [ "> 전체적으로 그럴싸함\n", "\n", "`-` 전체 사용자의 설정값" ], "id": "accc2a52-69ce-4bf8-99a1-33fd6a0b4116" }, { "cell_type": "code", "execution_count": 1111, "metadata": { "tags": [] }, "outputs": [], "source": [ "옥순성향 = torch.tensor([1.22,0.49]).reshape(1,2)\n", "영자성향 = torch.tensor([1.17,0.44]).reshape(1,2)\n", "정숙성향 = torch.tensor([1.21,-0.45]).reshape(1,2)\n", "영숙성향 = torch.tensor([1.20,-0.50]).reshape(1,2)\n", "순자성향 = torch.tensor([-1.20,0.51]).reshape(1,2)\n", "현숙성향 = torch.tensor([-1.23,0.48]).reshape(1,2)\n", "서연성향 = torch.tensor([-1.20,-0.48]).reshape(1,2)\n", "보람성향 = torch.tensor([-1.19,-0.49]).reshape(1,2)\n", "하니성향 = torch.tensor([0.2,0]).reshape(1,2)\n", "W = torch.concat([옥순성향,영자성향,정숙성향,영숙성향,순자성향,현숙성향,서연성향,보람성향,하니성향])\n", "b1 = torch.tensor([1.21,1.25,1.10,1.11,1.12,1.13,1.14,1.12,3.6]).reshape(-1,1) \n", "W,b1" ], "id": "1679a6fd-7604-4e86-92b9-6aa53b834b74" }, { "cell_type": "code", "execution_count": 1112, "metadata": { "tags": [] }, "outputs": [], "source": [ "영식성향 = torch.tensor([1.20,0.5]).reshape(1,2)\n", "영철성향 = torch.tensor([1.22,0.45]).reshape(1,2)\n", "영호성향 = torch.tensor([1.23,-0.7]).reshape(1,2)\n", "광수성향 = torch.tensor([1.21,-0.6]).reshape(1,2)\n", "상철성향 = torch.tensor([-1.28,0.6]).reshape(1,2)\n", "영수성향 = torch.tensor([-1.24,0.5]).reshape(1,2)\n", "규빈성향 = torch.tensor([-1.20,-0.5]).reshape(1,2)\n", "다호성향 = torch.tensor([-1.22,-0.6]).reshape(1,2)\n", "M = torch.concat([영식성향,영철성향,영호성향,광수성향,상철성향,영수성향,규빈성향,다호성향]) # 각 column은 남성출연자의 성향을 의미함\n", "b2 = torch.tensor([1.2,1.10,1.11,1.25,1.18,1.11,1.15,1.15]).reshape(-1,1)\n", "M,b2" ], "id": "946ea60e-e30b-4188-8bae-7c1b25ca0f47" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 아래의 행렬곱 관찰" ], "id": "d2201709-984b-49c0-9575-fa30794ad4ac" }, { "cell_type": "code", "execution_count": 1113, "metadata": { "tags": [] }, "outputs": [], "source": [ "W @ M.T + (b1 + b2.T)" ], "id": "8bebe3b6-ae46-4f8e-b5dd-bc580ec4448d" }, { "cell_type": "markdown", "metadata": {}, "source": [ "—저거 따져보자—\n", "\n", "${\\bf W} = \\begin{bmatrix} 1.2200 & 0.4900 \\\\ 1.1700 & 0.4400 \\\\ 1.2100 & -0.4500 \\\\ 1.2000 & -0.5000 \\\\ -1.2000 & 0.5100 \\\\ -1.2300 & 0.4800 \\\\ -1.2000 & -0.4800 \\\\ -1.1900 & -0.4900 \\\\ 0.2000 & 0.0000 \\end{bmatrix}$\n", "\n", "${\\bf M}^\\top = \\begin{bmatrix} 1.2000 & 1.2200 & 1.2300 & 1.2100 & -1.2800 & -1.2400 & -1.2000 & -1.2200 \\\\ 0.5000 & 0.4500 & -0.7000 & -0.6000 & 0.6000 & 0.5000 & -0.5000 & -0.6000 \\end{bmatrix}$\n", "\n", "${\\bf W} @ {\\bf M}^\\top = \\begin{bmatrix} 1.7090 & 1.7089 & 1.1576 & 1.1822 & -1.2676 & -1.2678 & -1.7090 & -1.7824 \\\\ 1.6240 & 1.6254 & 1.1311 & 1.1517 & -1.2336 & -1.2308 & -1.6240 & -1.6914 \\\\ 1.2270 & 1.2737 & 1.8033 & 1.7341 & -1.8188 & -1.7254 & -1.2270 & -1.2062 \\\\ 1.1900 & 1.2390 & 1.8260 & 1.7520 & -1.8360 & -1.7380 & -1.1900 & -1.1640 \\\\ -1.1850 & -1.2345 & -1.8330 & -1.7580 & 1.8420 & 1.7430 & 1.1850 & 1.1580 \\\\ -1.2360 & -1.2846 & -1.8489 & -1.7763 & 1.8624 & 1.7652 & 1.2360 & 1.2126 \\\\ -1.6800 & -1.6800 & -1.1400 & -1.1640 & 1.2480 & 1.2480 & 1.6800 & 1.7520 \\\\ -1.6730 & -1.6723 & -1.1207 & -1.1459 & 1.2292 & 1.2306 & 1.6730 & 1.7458 \\\\ 0.2400 & 0.2440 & 0.2460 & 0.2420 & -0.2560 & -0.2480 & -0.2400 & -0.2440 \\end{bmatrix}$\n", "\n", "$\\begin{align*} bias =~& \\begin{bmatrix} 1.2100 \\\\ 1.2500 \\\\ 1.1000 \\\\ 1.1100 \\\\ 1.1200 \\\\ 1.1300 \\\\ 1.1400 \\\\ 1.1200 \\\\ 3.6000 \\end{bmatrix} +\\begin{bmatrix} 1.2000 & 1.1000 & 1.1100 & 1.2500 & 1.1800 & 1.1100 & 1.1500 & 1.1500 \\end{bmatrix}\\\\ \\\\ =~& \\begin{bmatrix} 2.4100 & 2.3100 & 2.3200 & 2.4600 & 2.3900 & 2.3200 & 2.3600 & 2.3600 \\\\ 2.4500 & 2.3500 & 2.3600 & 2.5000 & 2.4300 & 2.3600 & 2.4000 & 2.4000 \\\\ 2.3000 & 2.2000 & 2.2100 & 2.3500 & 2.2800 & 2.2100 & 2.2500 & 2.2500 \\\\ 2.3100 & 2.2100 & 2.2200 & 2.3600 & 2.2900 & 2.2200 & 2.2600 & 2.2600 \\\\ 2.3200 & 2.2200 & 2.2300 & 2.3700 & 2.3000 & 2.2300 & 2.2700 & 2.2700 \\\\ 2.3300 & 2.2300 & 2.2400 & 2.3800 & 2.3100 & 2.2400 & 2.2800 & 2.2800 \\\\ 2.3400 & 2.2400 & 2.2500 & 2.3900 & 2.3200 & 2.2500 & 2.2900 & 2.2900 \\\\ 2.3200 & 2.2200 & 2.2300 & 2.3700 & 2.3000 & 2.2300 & 2.2700 & 2.2700 \\\\ 4.8000 & 4.7000 & 4.7100 & 4.8500 & 4.7800 & 4.7100 & 4.7500 & 4.7500 \\end{bmatrix} \\end{align*}$\n", "\n", "${\\bf W} @ {\\bf M}^\\top + bias = \\begin{bmatrix} 4.1190 & 4.0189 & 3.4776 & 3.6422 & 1.1224 & 1.0522 & 0.6510 & 0.5776 \\\\ 4.0740 & 3.9754 & 3.4911 & 3.6517 & 1.1964 & 1.1292 & 0.7760 & 0.7086 \\\\ 3.5270 & 3.4737 & 4.0133 & 4.0841 & 0.4612 & 0.4846 & 1.0230 & 1.0438 \\\\ 3.5000 & 3.4490 & 4.0460 & 4.1120 & 0.4540 & 0.4820 & 1.0700 & 1.0960 \\\\ 1.1350 & 0.9855 & 0.3970 & 0.6120 & 4.1420 & 3.9730 & 3.4550 & 3.4280 \\\\ 1.0940 & 0.9454 & 0.3911 & 0.6037 & 4.1724 & 4.0052 & 3.5160 & 3.4926 \\\\ 0.6600 & 0.5600 & 1.1100 & 1.2260 & 3.5680 & 3.4980 & 3.9700 & 4.0420 \\\\ 0.6470 & 0.5477 & 1.1093 & 1.2241 & 3.5292 & 3.4606 & 3.9430 & 4.0158 \\\\ 5.0400 & 4.9440 & 4.9560 & 5.0920 & 4.5240 & 4.4620 & 4.5100 & 4.5060 \\end{bmatrix}$\n", "\n", "`-` ${\\bf W} @ {\\bf M}^\\top + bias$ 의 (1,1)의 원소값을 계산해보면\n", "아래와 같다.\n", "\n", "- 옥순의I성향$\\times$영식의I성향 $+$ 옥순의N성향$\\times$영식의N성향\n", " $+$ 옥순의매력 $+$ 영식의매력 = 4.1190\n", "- $1.220 \\times 1.2000 + 0.4900 \\times 0.5000 + 1.2100 + 2.4100 = 4.1190$\n", "\n", "`-` 궁합매트릭스: ${\\bf W} @ {\\bf M}^\\top + bias$를 계산하면 (9,8) 인\n", "행렬이 나올텐데 이 행렬의 $(i,j)$의 원소는 $i$-th 여성출연자와 $j$-th\n", "남성출연자가 얼마나 잘 맞는지를 나타내는 숫자가 된다. (숫자가 높을수록\n", "잘 맞음) 편의상 이 수업에서는 이 매트릭스를 “궁합매트릭스” 라고\n", "정의하자.\n", "\n", "`-` 주어진 자료와 우리가 임의로 만든 궁합매트릭스를 비교해보자." ], "id": "7cbc8e88-5e09-4eac-954f-32f130957192" }, { "cell_type": "code", "execution_count": 893, "metadata": { "tags": [] }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "주어진자료:\n", "[[ nan 4.02 3.45 3.42 0.84 1.12 0.43 0.49]\n", " [3.93 3.99 3.63 3.43 0.98 0.96 0.52 nan]\n", " [3.52 3.42 4.05 4.06 0.39 nan 0.93 0.99]\n", " [3.43 3.57 nan 3.95 0.56 0.52 0.89 0.89]\n", " [1.12 nan 0.59 0.43 4.01 4.16 3.52 3.38]\n", " [0.94 1.05 0.32 0.45 4.02 3.78 nan 3.54]\n", " [0.51 0.56 0.88 0.89 3.5 3.64 4.04 4.1 ]\n", " [0.48 0.51 1.03 nan 3.52 4. 3.82 nan]\n", " [4.85 4.82 nan 4.98 4.53 4.39 4.45 4.52]]\n", "궁합매트릭스:\n", "[[4.12 4.02 3.48 3.64 1.12 1.05 0.65 0.58]\n", " [4.07 3.98 3.49 3.65 1.2 1.13 0.78 0.71]\n", " [3.53 3.47 4.01 4.08 0.46 0.48 1.02 1.04]\n", " [3.5 3.45 4.05 4.11 0.45 0.48 1.07 1.1 ]\n", " [1.14 0.99 0.4 0.61 4.14 3.97 3.46 3.43]\n", " [1.09 0.95 0.39 0.6 4.17 4.01 3.52 3.49]\n", " [0.66 0.56 1.11 1.23 3.57 3.5 3.97 4.04]\n", " [0.65 0.55 1.11 1.22 3.53 3.46 3.94 4.02]\n", " [5.04 4.94 4.96 5.09 4.52 4.46 4.51 4.51]]" ] } ], "source": [ "print(f\"주어진자료:\\n{np.array(df_view)}\")\n", "print(f\"궁합매트릭스:\\n{np.array(W @ M.T + b1 + b2.T).round(2)}\")" ], "id": "5b043949-5231-49ca-8d5e-c357f8ba2dbe" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 우리의 전략\n", "\n", "1. ${\\bf W} @ {\\bf M}^\\top + bias$의 값과 `df_view` 의 값이 **`nan`을\n", " 제외한 곳에서** 거의 비슷하게 되도록 ${\\bf W}$, ${\\bf M}$, $bias$를\n", " 잘 때려맞추면 되는것 아니야?\n", "\n", "2. 1을 만족하는 ${\\bf W}$, ${\\bf M}$, $bias$를 찾았으면 그 숫자들을\n", " 이용하여 `df_view`의 `nan` 을 추정한다.\n", "\n", "`-` 따라서 모형은 아래와 같이 볼 수 있다.\n", "\n", "$${\\tt df\\_view} \\approx {\\bf W}@{\\bf M}^\\top + bias$$\n", "\n", "`-` 아래의 정보를 참고하여 위의 수식을 다시 정리하면..\n", "\n", "| W | M | 여성특징 | 남성특징 | I궁합 | N궁합 | bias | yhat | y |\n", "|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|\n", "| 옥순(IN) | 영철(IN) | 1.22, 0.49 | 1.22, 0.45 | 1.4884[1] | 0.2205[2] | 2.31[3] | 4.0189 | 4.02 |\n", "| 옥순(IN) | 영호(IS) | 1.22, 0.49 | 1.23, -0.7 | 1.1576[4] | -0.3423[5] | 2.32[6] | 3.4776 | 3.45 |\n", "| … | … | … | … | … | … | | | |\n", "| 하니(I) | 영식(IN) | 0.20, 0.00 | 1.20, 0.5 | 0.24 | 0 | 4.8 | 5.04 | 4.85 |\n", "| … | … | … | … | … | … | | | |\n", "\n", "- 걱정1: 5.0이 넘는 값도 있네? 잘못잡으면 음수가 나올지도?\n", "- 걱정2: 저러한 yhat (4.0189, 3.4776, 5.04)을 만드는게 꼭 저 조합만\n", " 있는게 아님. 당장에 남성의 바이어스에 일괄적으로 -2를 넣고 여성의\n", " 바이어스에 일괄적으로 +2를 해도 성립함.\n", "\n", "`-` (걱정은 뒤로 하고) `yhat` $\\approx$ `y` 를 만족하도록 해보자! (1)\n", "아무 `yhat` 을 구한다. (2) `yhat`과 `y`가 비슷한 정도를 측정한다. (3) 더\n", "적당한 `yhat`값을 update한다.\n", "\n", "- `yhat`은 어떻게 구하지? (여성특징$\\otimes$남성특징).sum() + bias?\n", "- 그럼 여성특징,남성특징,여성bias(=여성매력),남성bias(=남성매력)는\n", " 어떻게 구하지?? 생각해보니까 데이터에서 주어진건 아니잖아??\n", "\n", "`-` `여성특징`,`남성특징`, `여성bais`,`남성bais` 를 어떻게 만들지?\n", "\n", "- 그전엔 어떻게 했지?? `W`을 보고 적당히 특징을 상상하고\n", " `여성특징`,`여성bias`의 값을 때려넣음 + `M`를 보고 적당히 특징을\n", " 상상하고 `남성특징`, `남성bias`의 값을 채워 넣음.\n", "- 자동화하려면? `W` $\\to$ `여성특징`, `W` $\\to$ `여성bias`, `M` $\\to$\n", " `남성특징`, `M` $\\to$ `남성bias` 인 함수를 만들자.\n", "\n", "`-` 앞으로 할일1: 아래와 같은 함수들을 만들자.\n", "\n", "- 옥순 $\\to$ 옥순의 특징 = (1.22, 0.49)\n", "- 옥순 $\\to$ 옥순의 매력 = 1.22\n", "- 영철 $\\to$ 영철의 특징 = (1.22, 0.45)\n", "- 영철 $\\to$ 영철의 매력 = 1.22 …\n", "\n", "`-` 앞으로 할일2: 우리가 익숙한 셋팅 (step1~4)\n", "\n", "1. `여성특징`, `여성bias`, `남성특징`, `남성bias` $\\to$ `yhat` 를 수행\n", "2. `y` $\\approx$ `yhat` 인지 체크: `loss = loss_fn(yhat,y)`\n", "3. `loss.backward()`\n", "4. 더 나은 `여성특징`, `여성bias`, `남성특징`, `남성bias` 로 update!\n", "\n", "## C. 할일1의 구현\n", "\n", "`-` dataframe의 변형\n", "\n", "[1] 1.22 \\*1.22 = 1.4884\n", "\n", "[2] 0.49 \\* 0.45 = 0.2205\n", "\n", "[3] 1.21+1.1 = 2.31\n", "\n", "[4] 1.22 \\*1.23 = 1.5006\n", "\n", "[5] 0.49 \\* -0.7 = -0.3423\n", "\n", "[6] 1.21+1.11 = 2.32" ], "id": "94b4b16c-f1b2-460b-af3f-cf1713c92213" }, { "cell_type": "code", "execution_count": 46, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_train = df_view.stack().reset_index().set_axis(['W','M','y'],axis=1)\n", "df_train" ], "id": "da09e75e-2594-40ff-b56b-f545110c241d" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 이름을 숫자화" ], "id": "1364ba25-1c96-4268-a12f-037d9ecc2f1b" }, { "cell_type": "code", "execution_count": 72, "metadata": { "tags": [] }, "outputs": [], "source": [ "w = {'옥순(IN)':0, '영자(IN)':1, '정숙(IS)':2, '영숙(IS)':3, '순자(EN)':4, '현숙(EN)':5, '서연(ES)':6, '보람(ES)':7, '하니(I)':8}\n", "m = {'영식(IN)':0, '영철(IN)':1, '영호(IS)':2, '광수(IS)':3, '상철(EN)':4, '영수(EN)':5, '규빈(ES)':6, '다호(ES)':7}" ], "id": "d955718d-920e-405e-9c7e-688ce8f6ddf1" }, { "cell_type": "code", "execution_count": 77, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_train['X1']= df_train['W'].map(w)\n", "df_train['X2']= df_train['M'].map(m)\n", "df_train" ], "id": "66953322-2837-4d97-9489-76620c030b4f" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 텐서화 + one_hot-인코딩" ], "id": "37f5a1cb-6cac-4efd-badd-157230af069e" }, { "cell_type": "code", "execution_count": 93, "metadata": { "tags": [] }, "outputs": [], "source": [ "X1 = torch.tensor(df_train['X1'])\n", "X2 = torch.tensor(df_train['X2'])\n", "E1 = torch.nn.functional.one_hot(X1).float()\n", "E2 = torch.nn.functional.one_hot(X2).float()" ], "id": "0ed8b7ac-6ade-4c0a-8aeb-af5490347a72" }, { "cell_type": "code", "execution_count": 116, "metadata": { "tags": [] }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "y.shape: torch.Size([63, 1]), y.dtype: torch.float32\n", "X1.shape: torch.Size([63]), X1.dtype: torch.int64 // X1.unique: tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])\n", "X2.shape: torch.Size([63]), X2.dtype: torch.int64 // X2.unique: tensor([0, 1, 2, 3, 4, 5, 6, 7])\n", "E1.shape: torch.Size([63, 9]), E1.dtype: torch.float32 -- shape에서 9는 여성이 9명이라는 의미\n", "E2.shape: torch.Size([63, 8]), E2.dtype: torch.float32 -- shape에서 8은 남성이 8명이라는 의미" ] } ], "source": [ "print(f\"y.shape: {y.shape},\\t y.dtype: {y.dtype}\")\n", "print(f\"X1.shape: {X1.shape},\\t X1.dtype: {X1.dtype} // X1.unique: {X1.unique()}\")\n", "print(f\"X2.shape: {X2.shape},\\t X2.dtype: {X2.dtype} // X2.unique: {X2.unique()}\")\n", "print(f\"E1.shape: {E1.shape},\\t E1.dtype: {E1.dtype} -- shape에서 9는 여성이 9명이라는 의미\")\n", "print(f\"E2.shape: {E2.shape},\\t E2.dtype: {E2.dtype} -- shape에서 8은 남성이 8명이라는 의미\")" ], "id": "69282daa-2b2b-4936-836b-a0b95e776e42" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` `X1` -\\> `여성특징`, `X1` -\\> `여성bias`, `X2` -\\> `남성특징`, `X2`\n", "-\\> `남성bias` 구현" ], "id": "1c7916b3-d41e-40f1-9758-186e02c93a10" }, { "cell_type": "code", "execution_count": 118, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1 = torch.nn.Linear(in_features=9, out_features=2, bias=False) # \"E1->여성특징\"인 함수 \n", "b1 = torch.nn.Linear(in_features=9, out_features=1, bias=False) # \"E1->여성bias\"인 함수 \n", "l2 = torch.nn.Linear(in_features=8, out_features=2, bias=False) # \"E2->남성특징\"인 함수 \n", "b2 = torch.nn.Linear(in_features=8, out_features=1, bias=False) # \"E2->남성bias\"인 함수 " ], "id": "3b9a7d62-6e6d-4830-bce5-52aa5f0a1427" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## D. 할일2의 구현 – step1~4 수행\n", "\n", "`-` step1: yhat을 구하자." ], "id": "787a51a1-1a0a-4ee2-b062-0fe69d12c60e" }, { "cell_type": "code", "execution_count": 147, "metadata": { "tags": [] }, "outputs": [], "source": [ "torch.manual_seed(43052)\n", "l1 = torch.nn.Linear(in_features=9, out_features=2, bias=False) # \"E1->여성특징\"인 함수 \n", "b1 = torch.nn.Linear(in_features=9, out_features=1, bias=False) # \"E1->여성bias\"인 함수 \n", "l2 = torch.nn.Linear(in_features=8, out_features=2, bias=False) # \"E2->남성특징\"인 함수 \n", "b2 = torch.nn.Linear(in_features=8, out_features=1, bias=False) # \"E2->남성bias\"인 함수 \n", "W_features = l1(E1) # l1(onehot(X1))\n", "W_bias = b1(E1) # b1(onehot(X1))\n", "M_features = l2(E2) # l2(onehot(X2))\n", "M_bias = b2(E2) # b2(onehot(X2))" ], "id": "76e4eca1-90dd-4eb4-936c-83adeb6f242d" }, { "cell_type": "code", "execution_count": 148, "metadata": { "tags": [] }, "outputs": [], "source": [ "sig = torch.nn.Sigmoid()\n", "score = (W_features*M_features).sum(axis=1).reshape(-1,1) + W_bias + M_bias\n", "yhat = sig(score)*5" ], "id": "2cd0e12f-7fae-4124-b8dd-5078e87f13c3" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` step2: 손실계산" ], "id": "b4df71c5-5c6c-48d2-a094-203a91f58e44" }, { "cell_type": "code", "execution_count": 149, "metadata": { "tags": [] }, "outputs": [], "source": [ "loss_fn = torch.nn.MSELoss()\n", "loss = loss_fn(yhat,y)" ], "id": "86d0d019-0560-49c1-8b05-e6ddabaa7366" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` step3: 미분\n", "\n", "(미분전)" ], "id": "2fbac820-c6de-4b2b-9876-89311f5cf891" }, { "cell_type": "code", "execution_count": 150, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.data, b1.weight.data, l2.weight.data, b2.weight.data" ], "id": "a8f5dde0-c196-41ca-8034-3bad2b32bb44" }, { "cell_type": "code", "execution_count": 151, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.grad, b1.weight.grad, l2.weight.grad, b2.weight.grad" ], "id": "80124173-6960-420c-bb98-66daed34ec66" }, { "cell_type": "markdown", "metadata": {}, "source": [ "(미분)" ], "id": "d4846d2c-b3cb-43f0-b4dc-8807692fc304" }, { "cell_type": "code", "execution_count": 153, "metadata": { "tags": [] }, "outputs": [], "source": [ "loss.backward()" ], "id": "e01247d2-931d-4278-992a-c28bf6aab8ba" }, { "cell_type": "markdown", "metadata": {}, "source": [ "(미분후)" ], "id": "49375943-22f9-4f42-be76-67df0ae80508" }, { "cell_type": "code", "execution_count": 154, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.data, b1.weight.data, l2.weight.data, b2.weight.data" ], "id": "ac4cd5ab-668b-4407-9fc1-b0b60d243e3a" }, { "cell_type": "code", "execution_count": 155, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.grad, b1.weight.grad, l2.weight.grad, b2.weight.grad" ], "id": "338a6149-2aa6-44eb-af22-66413b1cdbf1" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` step4: update\n", "\n", "(옵티마이저 선언)" ], "id": "78c3edd8-9e70-422a-93b0-9b5f0c0f1654" }, { "cell_type": "code", "execution_count": 164, "metadata": { "tags": [] }, "outputs": [], "source": [ "params = list(l1.parameters())+list(l2.parameters())+list(b1.parameters())+list(b2.parameters())\n", "optimizr = torch.optim.Adam(params, lr=0.1) " ], "id": "44d8bf98-677a-4f00-8bc8-6d63be932ad0" }, { "cell_type": "markdown", "metadata": {}, "source": [ "(update전)" ], "id": "301d1f03-4f7e-4fce-b5f6-0fc848a6dc82" }, { "cell_type": "code", "execution_count": 166, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.data, b1.weight.data, l2.weight.data, b2.weight.data" ], "id": "41e621c3-8eea-44fd-8dd4-cd23eafdb010" }, { "cell_type": "code", "execution_count": 167, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.grad, b1.weight.grad, l2.weight.grad, b2.weight.grad" ], "id": "d6625c95-a559-49aa-9372-3959bf71e67e" }, { "cell_type": "markdown", "metadata": {}, "source": [ "(update)" ], "id": "5afbfbb6-4f5d-440e-a00c-2de733f125fa" }, { "cell_type": "code", "execution_count": 168, "metadata": { "tags": [] }, "outputs": [], "source": [ "optimizr.step()" ], "id": "a00b0003-663a-4574-b3e3-e4dd0dcb9b0a" }, { "cell_type": "markdown", "metadata": {}, "source": [ "(update후)" ], "id": "00056d47-4cb0-4052-ab96-94a3027996f2" }, { "cell_type": "code", "execution_count": 169, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.data, b1.weight.data, l2.weight.data, b2.weight.data" ], "id": "b4238a82-22dd-4e57-bf31-4b891d4527d1" }, { "cell_type": "code", "execution_count": 170, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.grad, b1.weight.grad, l2.weight.grad, b2.weight.grad" ], "id": "a5c3d81f-3569-4f38-a1a5-96a8ffa6a1e7" }, { "cell_type": "markdown", "metadata": {}, "source": [ "(zero_grad)" ], "id": "b6a03f0c-3bb1-4c53-bb86-c3c89dfa40fb" }, { "cell_type": "code", "execution_count": 171, "metadata": { "tags": [] }, "outputs": [], "source": [ "optimizr.zero_grad()" ], "id": "f8621c21-6a24-4e3b-bbb5-570b38e2822e" }, { "cell_type": "markdown", "metadata": {}, "source": [ "(zero_grad후)" ], "id": "fbf7059c-d4f0-46bf-b825-e5579eb25cac" }, { "cell_type": "code", "execution_count": 172, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.data, b1.weight.data, l2.weight.data, b2.weight.data" ], "id": "9bcf4316-f5ed-485e-8138-0fc4f240526d" }, { "cell_type": "code", "execution_count": 173, "metadata": { "tags": [] }, "outputs": [], "source": [ "l1.weight.grad, b1.weight.grad, l2.weight.grad, b2.weight.grad" ], "id": "5b5c7f60-1fb0-473f-839b-880027e6b8d3" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## E. 코드정리" ], "id": "1d127aeb-a491-4381-a390-5735a01b35ea" }, { "cell_type": "code", "execution_count": 232, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_view = pd.read_csv('https://raw.githubusercontent.com/guebin/DL2024/main/posts/solo.csv',index_col=0)\n", "df_train = df_view.stack().reset_index().set_axis(['W','M','y'],axis=1)\n", "w = {'옥순(IN)':0, '영자(IN)':1, '정숙(IS)':2, '영숙(IS)':3, '순자(EN)':4, '현숙(EN)':5, '서연(ES)':6, '보람(ES)':7, '하니(I)':8}\n", "m = {'영식(IN)':0, '영철(IN)':1, '영호(IS)':2, '광수(IS)':3, '상철(EN)':4, '영수(EN)':5, '규빈(ES)':6, '다호(ES)':7}\n", "X1 = torch.tensor(df_train['W'].map(w)) # length-n vector \n", "X2 = torch.tensor(df_train['M'].map(m)) # length-n vector \n", "E1 = torch.nn.functional.one_hot(X1).float()\n", "E2 = torch.nn.functional.one_hot(X2).float()\n", "y = torch.tensor(df_train['y']).float().reshape(-1,1)\n", "#--#\n", "torch.manual_seed(43052)\n", "l1 = torch.nn.Linear(in_features=9, out_features=2, bias=False)\n", "b1 = torch.nn.Linear(in_features=9, out_features=1, bias=False)\n", "l2 = torch.nn.Linear(in_features=8, out_features=2, bias=False)\n", "b2 = torch.nn.Linear(in_features=8, out_features=1, bias=False)\n", "sig = torch.nn.Sigmoid()\n", "loss_fn = torch.nn.MSELoss()\n", "params = list(l1.parameters())+list(b1.parameters())+list(l2.parameters())+list(b2.parameters())\n", "optimizr = torch.optim.Adam(params, lr=0.1) \n", "#--#\n", "for epoc in range(100):\n", " ## step1 \n", " W_features = l1(E1)\n", " W_bias = b1(E1)\n", " M_features = l2(E2) \n", " M_bias = b2(E2)\n", " score = (W_features * M_features).sum(axis=1).reshape(-1,1) + W_bias + M_bias\n", " yhat = sig(score) * 5 \n", " ## step2 \n", " loss = loss_fn(yhat,y)\n", " ## step3 \n", " loss.backward()\n", " ## step4 \n", " optimizr.step()\n", " optimizr.zero_grad()" ], "id": "39c62145-47c2-4cd0-8656-e0c8e9b58d40" }, { "cell_type": "code", "execution_count": 233, "metadata": { "tags": [] }, "outputs": [], "source": [ "torch.concat([yhat,y],axis=1)[::4] # 꽤 잘맞음" ], "id": "200aa88c-8e98-4e0d-aa26-35c271a9c99f" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## F. 모형의 해석 – 쉬운경우" ], "id": "8e14101f-6fb3-4553-9d11-3a76ee9f4c4e" }, { "cell_type": "code", "execution_count": 276, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_match = pd.DataFrame((W_features*M_features).data).set_axis(['잠재특징궁합1','잠재특징궁합2'],axis=1)\n", "df_bias = pd.DataFrame(torch.concat([W_bias, M_bias],axis=1).data).set_axis(['여성bias','남성bias'],axis=1)\n", "df_features = pd.concat([df_train.loc[:,'W':'M'],df_match,df_bias],axis=1)\n", "df_features[:56]" ], "id": "0530e00c-6bfc-4574-93f4-04ea5cbceff1" }, { "cell_type": "code", "execution_count": 277, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_features[56:]" ], "id": "ec6dad2d-69d5-42b7-95ea-b63e6b084ee9" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## G. 모형의 해석 – 어려운 경우\n", "\n", "`-` 적합을 시켜보자." ], "id": "99c958a2-6b52-4087-a889-99bc7c2c6b64" }, { "cell_type": "code", "execution_count": 278, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_view = pd.read_csv('https://raw.githubusercontent.com/guebin/DL2024/main/posts/solo.csv',index_col=0)\n", "df_train = df_view.stack().reset_index().set_axis(['W','M','y'],axis=1)\n", "w = {'옥순(IN)':0, '영자(IN)':1, '정숙(IS)':2, '영숙(IS)':3, '순자(EN)':4, '현숙(EN)':5, '서연(ES)':6, '보람(ES)':7, '하니(I)':8}\n", "m = {'영식(IN)':0, '영철(IN)':1, '영호(IS)':2, '광수(IS)':3, '상철(EN)':4, '영수(EN)':5, '규빈(ES)':6, '다호(ES)':7}\n", "X1 = torch.tensor(df_train['W'].map(w)) # length-n vector \n", "X2 = torch.tensor(df_train['M'].map(m)) # length-n vector \n", "E1 = torch.nn.functional.one_hot(X1).float()\n", "E2 = torch.nn.functional.one_hot(X2).float()\n", "y = torch.tensor(df_train['y']).float().reshape(-1,1)\n", "#--#\n", "torch.manual_seed(8)\n", "l1 = torch.nn.Linear(in_features=9, out_features=2, bias=False)\n", "b1 = torch.nn.Linear(in_features=9, out_features=1, bias=False)\n", "l2 = torch.nn.Linear(in_features=8, out_features=2, bias=False)\n", "b2 = torch.nn.Linear(in_features=8, out_features=1, bias=False)\n", "sig = torch.nn.Sigmoid()\n", "loss_fn = torch.nn.MSELoss()\n", "params = list(l1.parameters())+list(b1.parameters())+list(l2.parameters())+list(b2.parameters())\n", "optimizr = torch.optim.Adam(params, lr=0.1) \n", "#--#\n", "for epoc in range(100):\n", " ## step1 \n", " W_features = l1(E1)\n", " W_bias = b1(E1)\n", " M_features = l2(E2) \n", " M_bias = b2(E2)\n", " score = (W_features * M_features).sum(axis=1).reshape(-1,1) + W_bias + M_bias\n", " yhat = sig(score) * 5 \n", " ## step2 \n", " loss = loss_fn(yhat,y)\n", " ## step3 \n", " loss.backward()\n", " ## step4 \n", " optimizr.step()\n", " optimizr.zero_grad()" ], "id": "263373ea-65c7-424b-aec2-89ab35d57038" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 잘 맞추는듯" ], "id": "496f55ae-d5d2-481a-a65e-36ce612231b1" }, { "cell_type": "code", "execution_count": 279, "metadata": { "tags": [] }, "outputs": [], "source": [ "torch.concat([yhat,y],axis=1)[::4] # 꽤 잘맞음" ], "id": "2996b848-13c1-4893-9cd7-37a1b4d728d8" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 해석을 해보자." ], "id": "41149b20-ef00-48da-b23c-76d9a75d84b3" }, { "cell_type": "code", "execution_count": 280, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_match = pd.DataFrame((W_features*M_features).data).set_axis(['잠재특징궁합1','잠재특징궁합2'],axis=1)\n", "df_bias = pd.DataFrame(torch.concat([W_bias, M_bias],axis=1).data).set_axis(['여성bias','남성bias'],axis=1)\n", "df_features = pd.concat([df_train.loc[:,'W':'M'],df_match,df_bias],axis=1)\n", "df_features[:56]" ], "id": "065558c1-8d82-4828-876a-cd766d1038ff" }, { "cell_type": "code", "execution_count": 281, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_features[56:]" ], "id": "c3acf019-a658-43d7-bc01-cf414af9726e" }, { "cell_type": "markdown", "metadata": {}, "source": [ "- I보다 E성향 남성이 좀 더 인기 있음.\n", "- E보다 I성향 여성이 좀 더 인기 있음.\n", "- 궁합1: (IN, IN) = 0.3 // (IN, IS) = 0.8 // (IN, EN) = -1.0 // (IN,\n", " ES) = -0.5\n", "- 궁합2: (IN, IN) = 1.4 // (IN, IS) = 0.4 // (IN, EN) = -0.4 // (IN,\n", " ES) = -1.4" ], "id": "eab52118-2145-428d-8e34-e9ea6a3c8f92" }, { "cell_type": "code", "execution_count": 291, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_features[df_features.W.str.contains('IN') & df_features.M.str.contains('ES')]" ], "id": "8b2dbed6-21c0-4898-bdfe-44474320da16" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## H. `NaN` 에 대한 예측 – 숙제\n", "\n", "# 5. HW\n", "\n", "아래의 코드를 활용하여 net를 적합시켜라." ], "id": "9a8895e1-7d97-4413-88a1-2d7385e631e4" }, { "cell_type": "code", "execution_count": 1169, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_view = pd.read_csv('https://raw.githubusercontent.com/guebin/DL2024/main/posts/solo.csv',index_col=0)\n", "df_train = df_view.stack().reset_index().set_axis(['W','M','y'],axis=1)\n", "w = {'옥순(IN)':0, '영자(IN)':1, '정숙(IS)':2, '영숙(IS)':3, '순자(EN)':4, '현숙(EN)':5, '서연(ES)':6, '보람(ES)':7, '하니(I)':8}\n", "m = {'영식(IN)':0, '영철(IN)':1, '영호(IS)':2, '광수(IS)':3, '상철(EN)':4, '영수(EN)':5, '규빈(ES)':6, '다호(ES)':7}\n", "X1 = torch.tensor(df_train['W'].map(w)) # length-n vector \n", "X2 = torch.tensor(df_train['M'].map(m)) # length-n vector \n", "E1 = torch.nn.functional.one_hot(X1).float()\n", "E2 = torch.nn.functional.one_hot(X2).float()\n", "y = torch.tensor(df_train['y']).float().reshape(-1,1)\n", "#--#\n", "torch.manual_seed(43052)\n", "l1 = torch.nn.Linear(in_features=9, out_features=2, bias=False)\n", "b1 = torch.nn.Linear(in_features=9, out_features=1, bias=False)\n", "l2 = torch.nn.Linear(in_features=8, out_features=2, bias=False)\n", "b2 = torch.nn.Linear(in_features=8, out_features=1, bias=False)\n", "sig = torch.nn.Sigmoid()\n", "loss_fn = torch.nn.MSELoss()\n", "params = list(l1.parameters())+list(b1.parameters())+list(l2.parameters())+list(b2.parameters())\n", "optimizr = torch.optim.Adam(params, lr=0.1) \n", "#--#\n", "for epoc in range(100):\n", " ## step1 \n", " W_features = l1(E1)\n", " W_bias = b1(E1)\n", " M_features = l2(E2) \n", " M_bias = b2(E2)\n", " score = (W_features * M_features).sum(axis=1).reshape(-1,1) + W_bias + M_bias\n", " yhat = sig(score) * 5 \n", " ## step2 \n", " loss = loss_fn(yhat,y)\n", " ## step3 \n", " loss.backward()\n", " ## step4 \n", " optimizr.step()\n", " optimizr.zero_grad()" ], "id": "aeddc768-783d-4987-a1f8-63b26a6d5c08" }, { "cell_type": "markdown", "metadata": {}, "source": [ "적합된 네트워크를 바탕으로 아래의 값에 대한 예측을 수행하라." ], "id": "1b414fc2-6a78-48b6-b583-e8ede32f2940" }, { "cell_type": "code", "execution_count": 1178, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_test = pd.DataFrame({'W':['옥순(IN)','보람(ES)','하니(I)'],'M':['영식(IN)','다호(ES)','영호(IS)']})\n", "df_test" ], "id": "ad9a7607-4228-4047-b0c1-83a037653b92" }, { "cell_type": "markdown", "metadata": {}, "source": [ "**hint** 답은 아래와 같다." ], "id": "072451d8-93a7-4c96-8285-b62b81a5af7e" }, { "cell_type": "code", "execution_count": 1183, "metadata": { "tags": [] }, "outputs": [], "source": [ "yyhat.data" ], "id": "8d59c0a5-f053-4685-b306-3b9209c394df" } ], "nbformat": 4, "nbformat_minor": 5, "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3 (ipykernel)", "language": "python" }, "language_info": { "name": "python", "codemirror_mode": { "name": "ipython", "version": "3" }, "file_extension": ".py", "mimetype": "text/x-python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.8" } } }