{"id":79,"date":"2020-06-02T22:25:02","date_gmt":"2020-06-02T13:25:02","guid":{"rendered":"http:\/\/cedartrees.co.kr\/?p=79"},"modified":"2021-04-03T19:22:39","modified_gmt":"2021-04-03T10:22:39","slug":"naive-faq-chatbot-2","status":"publish","type":"post","link":"http:\/\/blog.cedartrees.co.kr\/index.php\/2020\/06\/02\/naive-faq-chatbot-2\/","title":{"rendered":"Naive-FAQ-Chatbot-2"},"content":{"rendered":"<h1>\uac04\ub2e8\ud55c FAQ \ucc57\ubd07\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/h1>\n<p>\uc774 \ucc57\ubd07\uc740 \uac04\ub2e8\ud55c \ud615\ud0dc\ub85c \ucc57\ubd07\uc744 \ucc98\uc74c \uc811\ud558\uc2dc\ub294 \ubd84\ub4e4\uc744 \uc704\ud574 \uc791\uc131\ud55c \ucf54\ub4dc\uc815\ub3c4\ub85c \uc0dd\uac01\ud558\uc2dc\uba74 \ub420\ub4ef\ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc544\ub798\uc758 \ud30c\uc77c\uc740 trainer.py \uc785\ub2c8\ub2e4.<\/h3>\n<p>\ud574\ub2f9 \ud30c\uc77c\uc758 \uae30\ub2a5\uc740 \ubaa8\ub378\uc744 \ud6c8\ub828\ud558\uace0 \uac80\uc99d\ud558\ub294 \uc5ed\ud560\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"wp-block-code\"><code>class Trainer():\ndef __init__(self, model, optimizer, crit):\n    self.model = model\n    self.optimizer = optimizer\n    self.loss = loss\n\n    super().__init__()<\/code><\/pre>\n\n\n\n<p>\uc704\uc758 \ubd80\ubd84\uc740 Trainer \ud074\ub798\uc2a4\uc758 \uc120\uc5b8\ubd80\ub85c model, optimizer, loss \uac12\uc744 \uc804\ub2ec \ubc1b\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def train(self, train_data, valid_data, config):\n        lowest_loss = np.inf\n        best_model = None\n\n        for epoch_index in range(config.n_epochs):\n            train_loss = self._train(train_data&#91;0], train_data&#91;1], config)\n            valid_loss = self._validate(valid_data&#91;0], valid_data&#91;1], config)\n\n            # You must use deep copy to take a snapshot of current best weights.\n            if valid_loss &lt;= lowest_loss:\n                lowest_loss = valid_loss\n                best_model = deepcopy(self.model.state_dict())\n\n            print(\"Epoch(%d\/%d): train_loss=%.4e  valid_loss=%.4e  lowest_loss=%.4e\" % (\n                epoch_index + 1,\n                config.n_epochs,\n                train_loss,\n                valid_loss,\n                lowest_loss,\n            ))\n\n        # Restore to best model.\n        self.model.load_state_dict(best_model)<\/code><\/pre>\n\n\n\n<p>train() \ud568\uc218\ub294 \uc785\ub825 \ubc1b\uc740 \ub370\uc774\ud130\ub97c epoch \ub9cc\ud07c \ud559\uc2b5\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4.<br>\uc774\ub54c _train()\uacfc _valid()\ud568\uc218\ub97c \ud638\ucd9c\ud558\ub294\ub370 _train()\uc740 \ud559\uc2b5\uc744 _valid()\ub294 \uac80\uc99d\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc785\ub825 \ub370\uc774\ud130\ub294 \ub2e8\uc5b4\uc758 one-hot \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ub354 \uc88b\uc740 \uacb0\uacfc\ub97c \uc5bb\uae30 \uc704\ud574\uc11c\ub294 one-hot \ubcf4\ub2e4\ub294 embedding\ub41c \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \uadf8 \uc774\uc720\ub294 one-hot\uc758 \ud2b9\uc9d5\uc0c1 \ub2e8\uc5b4\uac04\uc758 \uad00\uacc4\ub97c \ud45c\ud604 \ud560 \uc218 \uc5c6\uae30 \ub54c\ubb38\uc774\uba70 one-hot \ub370\uc774\ud130\uac00 sparse\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>word\ub97c embedding\ud558\ub294 \uac00\uc7a5 \ub300\ud45c\uc801\uc778 \ubc29\ubc95\uc778 word2vec\uc744 \uc0ac\uc6a9\ud558\uae30\ub97c \ucd94\ucc9c\ud569\ub2c8\ub2e4. \ub2e4\ub9cc \uc5ec\uae30\uc11c\ub294 naive\ud55c \ud615\ud0dc\uc758 \ucc57\ubd07\uc774\uae30 \ub54c\ubb38\uc5d0 one-hot\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud14c\uc2a4\ud2b8\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    def _train(self, x, y, config):\n        self.model.train()\n\n        # Shuffle before begin.\n        indices = torch.randperm(x.size(0), device=x.device)\n        x = torch.index_select(x, dim=0, index=indices).split(config.batch_size, dim=0)\n        y = torch.index_select(y, dim=0, index=indices).split(config.batch_size, dim=0)\n\n        total_loss = 0\n\n        for i, (x_i, y_i) in enumerate(zip(x, y)):\n            y_hat_i = self.model(x_i)\n            loss_i = self.crit(y_hat_i, y_i.squeeze())\n\n            # Initialize the gradients of the model.\n            self.optimizer.zero_grad()\n            loss_i.backward()\n\n            self.optimizer.step()\n\n            if config.verbose >= 2:\n                print(\"Train Iteration(%d\/%d): loss=%.4e\" % (i + 1, len(x), float(loss_i)))\n\n            # Don't forget to detach to prevent memory leak.\n            total_loss += float(loss_i)\n\n        return total_loss \/ len(x)<\/code><\/pre>\n\n\n\n<p>\uc704\uc758 \ucf54\ub4dc\uc640 \uac19\uc774 \ud559\uc2b5\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4. <br>\ud559\uc2b5 \ub370\uc774\ud130\ub294 \uc0ac\uc804\uc5d0 \uc815\uc758\ud55c \ubc30\uce58 \uc0ac\uc774\uc988\uc5d0 \ub9de\ucdb0 \ubd84\ud560 \ud559\uc2b5\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<br>\uc774\ub54c \ud604\uc7ac \ubaa8\ub378\uc774 \ud559\uc2b5 \uc911\uc774\ub77c\ub294 \uac83\uc744 \uc54c\ub824\uc8fc\uae30 \uc704\ud574 model.train()\uc744 \uc120\uc5b8\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def _validate(self, x, y, config):\n        # Turn evaluation mode on.\n        self.model.eval()\n\n        # Turn on the no_grad mode to make more efficintly.\n        with torch.no_grad():\n            # Shuffle before begin.\n            indices = torch.randperm(x.size(0), device=x.device)\n            x = torch.index_select(x, dim=0, index=indices).split(config.batch_size, dim=0)\n            y = torch.index_select(y, dim=0, index=indices).split(config.batch_size, dim=0)\n\n            total_loss = 0\n\n            for i, (x_i, y_i) in enumerate(zip(x, y)):\n                y_hat_i = self.model(x_i)\n                loss_i = self.crit(y_hat_i, y_i.squeeze())\n\n                if config.verbose >= 2:\n                    print(\"Valid Iteration(%d\/%d): loss=%.4e\" % (i + 1, len(x), float(loss_i)))\n\n                total_loss += float(loss_i)\n\n            return total_loss \/ len(x)<\/code><\/pre>\n\n\n\n<p>validate \ucf54\ub4dc\ub3c4 train \ucf54\ub4dc\uc640 \uac70\uc758 \ub3d9\uc77c\ud569\ub2c8\ub2e4.<br>\ub2e4\ub978 \uc810\uc740 train\uc5d0\uc11c \ud559\uc2b5\uc5d0 \uad00\ub828\ub41c \ubd80\ubd84\uc774 validate\uc5d0\uc11c\ub294 \ube60\uc838\uc788\ub2e4\ub294 \ubd80\ubd84\uc785\ub2c8\ub2e4. \ub2e8\uc21c\ud788 \uac80\uc99d\ub9cc \ud558\ub294 \ub370\uc774\ud130\uc774\uae30 \ub54c\ubb38\uc5d0 \ud559\uc2b5\uc774 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<br>\ud2b9\ud788 \uc78a\uc9c0 \ub9d0\uc544\uc57c \ud560 \uac83\uc740 model.eval()\uc744 \uc2e4\ud589\uc2dc\ucf1c\uc918\uc57c \ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>validation\uc740 \uacfc\uc801\ud569\uc744 \ubc29\uc9c0\ud558\uae30 \uc704\ud574\uc11c \uc2e4\ud589\ud558\ub294 \uac83\uc73c\ub85c \ub300\ubd80\ubd84 \ub370\uc774\ud130\uc14b\uc744 8:2, 7:3 \uc815\ub3c4\ub85c \ubd84\ub9ac\ud558\uc5ec \ud559\uc2b5\uacfc \uac80\uc99d\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774\uc81c \ub0a8\uc740 \ubd80\ubd84\uc740 \uc774\ub807\uac8c \ub9cc\ub4e4\uc5b4\uc9c4 \ubaa8\ub378\uc744 \ud1b5\ud574 \uc608\uce21\uc744 \uc218\ud589\ud558\ub294 \ucf54\ub4dc\uac00 \ub0a8\uc544 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ud574\ub2f9 \ucf54\ub4dc\ub294 Naive-FAQ-Chatbot-3\uc5d0\uc11c \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uac04\ub2e8\ud55c FAQ \ucc57\ubd07\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \ucc57\ubd07\uc740 \uac04\ub2e8\ud55c \ud615\ud0dc\ub85c \ucc57\ubd07\uc744 \ucc98\uc74c \uc811\ud558\uc2dc\ub294 \ubd84\ub4e4\uc744 \uc704\ud574 \uc791\uc131\ud55c \ucf54\ub4dc\uc815\ub3c4\ub85c \uc0dd\uac01\ud558\uc2dc\uba74 \ub420\ub4ef\ud569\ub2c8\ub2e4. \uc544\ub798\uc758 \ud30c\uc77c\uc740 trainer.py \uc785\ub2c8\ub2e4. \ud574\ub2f9 \ud30c\uc77c\uc758 \uae30\ub2a5\uc740 \ubaa8\ub378\uc744 \ud6c8\ub828\ud558\uace0 \uac80\uc99d\ud558\ub294 \uc5ed\ud560\uc744 \uc218\ud589\ud569\ub2c8\ub2e4. \uc704\uc758 \ubd80\ubd84\uc740 Trainer \ud074\ub798\uc2a4\uc758 \uc120\uc5b8\ubd80\ub85c model, optimizer, loss \uac12\uc744 \uc804\ub2ec \ubc1b\uc2b5\ub2c8\ub2e4. train() \ud568\uc218\ub294 \uc785\ub825 \ubc1b\uc740 \ub370\uc774\ud130\ub97c epoch \ub9cc\ud07c \ud559\uc2b5\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4.\uc774\ub54c _train()\uacfc _valid()\ud568\uc218\ub97c \ud638\ucd9c\ud558\ub294\ub370 _train()\uc740 \ud559\uc2b5\uc744 _valid()\ub294 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.cedartrees.co.kr\/index.php\/2020\/06\/02\/naive-faq-chatbot-2\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Naive-FAQ-Chatbot-2&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[14,15],"tags":[5,86,61,55,4],"_links":{"self":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/79"}],"collection":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/comments?post=79"}],"version-history":[{"count":8,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/79\/revisions"}],"predecessor-version":[{"id":108,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/posts\/79\/revisions\/108"}],"wp:attachment":[{"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/media?parent=79"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/categories?post=79"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.cedartrees.co.kr\/index.php\/wp-json\/wp\/v2\/tags?post=79"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}