{
  "id": 106288,
  "title": "15th place solution",
  "url": "/competitions/champs-scalar-coupling/discussion/106288",
  "author_name": "Zhenlan",
  "post_date": "2019-08-29T01:50:03.688000",
  "votes": 29,
  "comment_count": 14,
  "views": 0,
  "content": "<p>First off, I would like to thank Kaggle, the host, and my team <a href=\"/senkin13\">@senkin13</a>  , <a href=\"/alexpartisan\">@alexpartisan</a> , <a href=\"/chenlongwang\">@chenlongwang</a> . It has been an interesting journey for me and certainly very rewarding to get my first gold. And Congrats to all who has worked hard for this competition!</p>\n\n<p>I was mainly working on GNN while my teammates have worked on NN/lgb/feature engineering/stacking. So I will be focusing on GNN and leave the rest to them. </p>\n\n<p>I mostly used <a href=\"https://github.com/rusty1s/pytorch_geometric\">pytorch_geometric</a> for GNN, which is an amazing library. Network structures I have tried but failed to work include NNConv (<a href=\"https://arxiv.org/abs/1704.02901\">https://arxiv.org/abs/1704.02901</a>), SchNet (<a href=\"https://arxiv.org/abs/1706.08566\">https://arxiv.org/abs/1706.08566</a>). I guess the reason is that those networks does not update edge information and this competition aims to predict edge attributes. I tried various ways (concat/add/multiply) to combine node information of the last layer into edge to make predictions but they do not work as well.</p>\n\n<p>Our major break through is based on Graph Networks as a Universal Machine Learning Framework for Molecules and Crystals (<a href=\"https://arxiv.org/pdf/1812.05055.pdf\">https://arxiv.org/pdf/1812.05055.pdf</a>), in which both edge and node information are updated together. On top of the edge prediction, I add MLP per type to make the final prediction. </p>\n\n<p>As for training, we tried both training each type separately and all types together and found that training all types together gives more stable results. We also tried fine-tune each type after training all types together first. But we found that it overfits very fast and leads to worse results.</p>\n\n<p>One question I was never able to answer is that, there are two types of graph, one based on chemical bond and one based on coupling that we seek to predict. While they have the same node, edge connection is very different. Not having any background knowledge in this domain, we were not sure which one to train GNN on and left it to trial and error. Maybe someone with domain knowledge could shed some light on this.</p>\n\n<p>Again, Congrats to all winners and look forward to their solution.</p>\n\n<p>Best,</p>\n\n<p>Zhenlan,</p>",
  "messages": [
    {
      "id": 610833,
      "postDate": "2019-08-29T01:50:03.690Z",
      "content": "<p>First off, I would like to thank Kaggle, the host, and my team <a href=\"/senkin13\">@senkin13</a>  , <a href=\"/alexpartisan\">@alexpartisan</a> , <a href=\"/chenlongwang\">@chenlongwang</a> . It has been an interesting journey for me and certainly very rewarding to get my first gold. And Congrats to all who has worked hard for this competition!</p>\n\n<p>I was mainly working on GNN while my teammates have worked on NN/lgb/feature engineering/stacking. So I will be focusing on GNN and leave the rest to them. </p>\n\n<p>I mostly used <a href=\"https://github.com/rusty1s/pytorch_geometric\">pytorch_geometric</a> for GNN, which is an amazing library. Network structures I have tried but failed to work include NNConv (<a href=\"https://arxiv.org/abs/1704.02901\">https://arxiv.org/abs/1704.02901</a>), SchNet (<a href=\"https://arxiv.org/abs/1706.08566\">https://arxiv.org/abs/1706.08566</a>). I guess the reason is that those networks does not update edge information and this competition aims to predict edge attributes. I tried various ways (concat/add/multiply) to combine node information of the last layer into edge to make predictions but they do not work as well.</p>\n\n<p>Our major break through is based on Graph Networks as a Universal Machine Learning Framework for Molecules and Crystals (<a href=\"https://arxiv.org/pdf/1812.05055.pdf\">https://arxiv.org/pdf/1812.05055.pdf</a>), in which both edge and node information are updated together. On top of the edge prediction, I add MLP per type to make the final prediction. </p>\n\n<p>As for training, we tried both training each type separately and all types together and found that training all types together gives more stable results. We also tried fine-tune each type after training all types together first. But we found that it overfits very fast and leads to worse results.</p>\n\n<p>One question I was never able to answer is that, there are two types of graph, one based on chemical bond and one based on coupling that we seek to predict. While they have the same node, edge connection is very different. Not having any background knowledge in this domain, we were not sure which one to train GNN on and left it to trial and error. Maybe someone with domain knowledge could shed some light on this.</p>\n\n<p>Again, Congrats to all winners and look forward to their solution.</p>\n\n<p>Best,</p>\n\n<p>Zhenlan,</p>",
      "rawMarkdown": "First off, I would like to thank Kaggle, the host, and my team @senkin13  , @alexpartisan , @chenlongwang . It has been an interesting journey for me and certainly very rewarding to get my first gold. And Congrats to all who has worked hard for this competition!\n\nI was mainly working on GNN while my teammates have worked on NN/lgb/feature engineering/stacking. So I will be focusing on GNN and leave the rest to them. \n\nI mostly used [pytorch_geometric](https://github.com/rusty1s/pytorch_geometric) for GNN, which is an amazing library. Network structures I have tried but failed to work include NNConv (https://arxiv.org/abs/1704.02901), SchNet (https://arxiv.org/abs/1706.08566). I guess the reason is that those networks does not update edge information and this competition aims to predict edge attributes. I tried various ways (concat/add/multiply) to combine node information of the last layer into edge to make predictions but they do not work as well.\n\nOur major break through is based on Graph Networks as a Universal Machine Learning Framework for Molecules and Crystals (https://arxiv.org/pdf/1812.05055.pdf), in which both edge and node information are updated together. On top of the edge prediction, I add MLP per type to make the final prediction. \n\nAs for training, we tried both training each type separately and all types together and found that training all types together gives more stable results. We also tried fine-tune each type after training all types together first. But we found that it overfits very fast and leads to worse results.\n\nOne question I was never able to answer is that, there are two types of graph, one based on chemical bond and one based on coupling that we seek to predict. While they have the same node, edge connection is very different. Not having any background knowledge in this domain, we were not sure which one to train GNN on and left it to trial and error. Maybe someone with domain knowledge could shed some light on this.\n\nAgain, Congrats to all winners and look forward to their solution.\n\nBest,\n\nZhenlan,\n",
      "votes": 28
    },
    {
      "id": 612719,
      "postDate": "2019-08-30T00:48:03.627Z",
      "content": "<p>Congrats and thank <a href=\"/zhenlanwang\">@zhenlanwang</a> , very informative.</p>",
      "rawMarkdown": "Congrats and thank @zhenlanwang , very informative.",
      "votes": 1,
      "replies": [
        {
          "id": 612721,
          "postDate": "2019-08-30T00:49:31.657Z",
          "content": "<p>congrats to your teammates as well <a href=\"/senkin13\">@senkin13</a> <a href=\"/chenlongwang\">@chenlongwang</a> <a href=\"/alexpartisan\">@alexpartisan</a>  </p>",
          "rawMarkdown": "congrats to your teammates as well @senkin13 @chenlongwang @alexpartisan  "
        }
      ]
    },
    {
      "id": 610855,
      "postDate": "2019-08-29T02:02:55.570Z",
      "content": "<p>Lucky to have a magnificent teammate like you, really enjoy the journey fighting with you guys.</p>",
      "rawMarkdown": "Lucky to have a magnificent teammate like you, really enjoy the journey fighting with you guys.",
      "votes": 1
    },
    {
      "id": 611310,
      "postDate": "2019-08-29T07:57:01.133Z",
      "content": "<p>Congrats and thanks for sharing, so what worked best between following \"real bonds\" or prediction bonds? </p>",
      "rawMarkdown": "Congrats and thanks for sharing, so what worked best between following \"real bonds\" or prediction bonds? ",
      "replies": [
        {
          "id": 611997,
          "postDate": "2019-08-29T14:51:07.700Z",
          "content": "<p>We ended up using a combination of both. \"real bond\" followed by prediction bonds. </p>",
          "rawMarkdown": "We ended up using a combination of both. \"real bond\" followed by prediction bonds. ",
          "votes": 1
        }
      ]
    },
    {
      "id": 611112,
      "postDate": "2019-08-29T05:35:32.203Z",
      "content": "<p>Congratulations! We also tried MEGNet which was super easy to implement in PyTorch geometric. Unfortunately, we couldn't get it to work as well as you. Did you make individual graphs for each <code>id</code> in <code>train.csv</code>?</p>",
      "rawMarkdown": "Congratulations! We also tried MEGNet which was super easy to implement in PyTorch geometric. Unfortunately, we couldn't get it to work as well as you. Did you make individual graphs for each `id` in `train.csv`?",
      "replies": [
        {
          "id": 611999,
          "postDate": "2019-08-29T14:52:43.377Z",
          "content": "<p>Each molecule forms its own graph with node being atom and edge being chemical bond or coupling.</p>",
          "rawMarkdown": "Each molecule forms its own graph with node being atom and edge being chemical bond or coupling.",
          "votes": 1
        },
        {
          "id": 612008,
          "postDate": "2019-08-29T14:59:45.290Z",
          "content": "<p>Thanks very much for sharing! How did you use one graph to predict J for multiple atom pairs? (I think this is where I went wrong)</p>",
          "rawMarkdown": "Thanks very much for sharing! How did you use one graph to predict J for multiple atom pairs? (I think this is where I went wrong)"
        }
      ]
    },
    {
      "id": 611038,
      "postDate": "2019-08-29T04:27:14.617Z",
      "content": "<p>Congrats  !!</p>",
      "rawMarkdown": "Congrats  !!"
    },
    {
      "id": 610971,
      "postDate": "2019-08-29T03:37:31.647Z",
      "content": "<p>Congratulations!</p>\n\n<p>It is cool that you were able to make that architecture to work!</p>",
      "rawMarkdown": "Congratulations!\n\nIt is cool that you were able to make that architecture to work!"
    },
    {
      "id": 610854,
      "postDate": "2019-08-29T02:02:49.150Z",
      "content": "<p>Congratulations! Good job at GNN, Looking forward to see your solution kernel!</p>",
      "rawMarkdown": "Congratulations! Good job at GNN, Looking forward to see your solution kernel!"
    },
    {
      "id": 612241,
      "postDate": "2019-08-29T17:12:35.307Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 610899,
      "postDate": "2019-08-29T02:45:40.133Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 611313,
      "postDate": "2019-08-29T07:59:05.400Z",
      "content": "<p>Congratulations and thanks for sharing!</p>",
      "rawMarkdown": "Congratulations and thanks for sharing!",
      "votes": 1
    }
  ],
  "comments": [
    {
      "id": 612719,
      "author_name": "Michel ML",
      "author_url": "",
      "post_date": "2019-08-30T00:48:03.627000",
      "content": "<p>Congrats and thank <a href=\"/zhenlanwang\">@zhenlanwang</a> , very informative.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 612721,
          "author_name": "Michel ML",
          "author_url": "",
          "post_date": "2019-08-30T00:49:31.657000",
          "content": "<p>congrats to your teammates as well <a href=\"/senkin13\">@senkin13</a> <a href=\"/chenlongwang\">@chenlongwang</a> <a href=\"/alexpartisan\">@alexpartisan</a>  </p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 610855,
      "author_name": "Alexpartisan",
      "author_url": "",
      "post_date": "2019-08-29T02:02:55.570000",
      "content": "<p>Lucky to have a magnificent teammate like you, really enjoy the journey fighting with you guys.</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 611310,
      "author_name": "Optimo",
      "author_url": "",
      "post_date": "2019-08-29T07:57:01.133000",
      "content": "<p>Congrats and thanks for sharing, so what worked best between following \"real bonds\" or prediction bonds? </p>",
      "votes": 0,
      "replies": [
        {
          "id": 611997,
          "author_name": "Zhenlan",
          "author_url": "",
          "post_date": "2019-08-29T14:51:07.700000",
          "content": "<p>We ended up using a combination of both. \"real bond\" followed by prediction bonds. </p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 611112,
      "author_name": "datasaurus",
      "author_url": "",
      "post_date": "2019-08-29T05:35:32.203000",
      "content": "<p>Congratulations! We also tried MEGNet which was super easy to implement in PyTorch geometric. Unfortunately, we couldn't get it to work as well as you. Did you make individual graphs for each <code>id</code> in <code>train.csv</code>?</p>",
      "votes": 0,
      "replies": [
        {
          "id": 611999,
          "author_name": "Zhenlan",
          "author_url": "",
          "post_date": "2019-08-29T14:52:43.377000",
          "content": "<p>Each molecule forms its own graph with node being atom and edge being chemical bond or coupling.</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 612008,
          "author_name": "datasaurus",
          "author_url": "",
          "post_date": "2019-08-29T14:59:45.290000",
          "content": "<p>Thanks very much for sharing! How did you use one graph to predict J for multiple atom pairs? (I think this is where I went wrong)</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 611038,
      "author_name": "Ashesh.",
      "author_url": "",
      "post_date": "2019-08-29T04:27:14.617000",
      "content": "<p>Congrats  !!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 610971,
      "author_name": "Andrey Lukyanenko",
      "author_url": "",
      "post_date": "2019-08-29T03:37:31.647000",
      "content": "<p>Congratulations!</p>\n\n<p>It is cool that you were able to make that architecture to work!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 610854,
      "author_name": "Zhuang Jia",
      "author_url": "",
      "post_date": "2019-08-29T02:02:49.150000",
      "content": "<p>Congratulations! Good job at GNN, Looking forward to see your solution kernel!</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 612241,
      "author_name": "",
      "author_url": "",
      "post_date": "2019-08-29T17:12:35.307000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 610899,
      "author_name": "",
      "author_url": "",
      "post_date": "2019-08-29T02:45:40.133000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 611313,
      "author_name": "Stanislav Blinov",
      "author_url": "",
      "post_date": "2019-08-29T07:59:05.400000",
      "content": "<p>Congratulations and thanks for sharing!</p>",
      "votes": 1,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "610833": "First off, I would like to thank Kaggle, the host, and my team @senkin13  , @alexpartisan , @chenlongwang . It has been an interesting journey for me and certainly very rewarding to get my first gold. And Congrats to all who has worked hard for this competition!\n\nI was mainly working on GNN while my teammates have worked on NN/lgb/feature engineering/stacking. So I will be focusing on GNN and leave the rest to them. \n\nI mostly used [pytorch_geometric](https://github.com/rusty1s/pytorch_geometric) for GNN, which is an amazing library. Network structures I have tried but failed to work include NNConv (https://arxiv.org/abs/1704.02901), SchNet (https://arxiv.org/abs/1706.08566). I guess the reason is that those networks does not update edge information and this competition aims to predict edge attributes. I tried various ways (concat/add/multiply) to combine node information of the last layer into edge to make predictions but they do not work as well.\n\nOur major break through is based on Graph Networks as a Universal Machine Learning Framework for Molecules and Crystals (https://arxiv.org/pdf/1812.05055.pdf), in which both edge and node information are updated together. On top of the edge prediction, I add MLP per type to make the final prediction. \n\nAs for training, we tried both training each type separately and all types together and found that training all types together gives more stable results. We also tried fine-tune each type after training all types together first. But we found that it overfits very fast and leads to worse results.\n\nOne question I was never able to answer is that, there are two types of graph, one based on chemical bond and one based on coupling that we seek to predict. While they have the same node, edge connection is very different. Not having any background knowledge in this domain, we were not sure which one to train GNN on and left it to trial and error. Maybe someone with domain knowledge could shed some light on this.\n\nAgain, Congrats to all winners and look forward to their solution.\n\nBest,\n\nZhenlan,\n",
    "612719": "Congrats and thank @zhenlanwang , very informative.",
    "610855": "Lucky to have a magnificent teammate like you, really enjoy the journey fighting with you guys.",
    "611310": "Congrats and thanks for sharing, so what worked best between following \"real bonds\" or prediction bonds? ",
    "611112": "Congratulations! We also tried MEGNet which was super easy to implement in PyTorch geometric. Unfortunately, we couldn't get it to work as well as you. Did you make individual graphs for each `id` in `train.csv`?",
    "611038": "Congrats  !!",
    "610971": "Congratulations!\n\nIt is cool that you were able to make that architecture to work!",
    "610854": "Congratulations! Good job at GNN, Looking forward to see your solution kernel!",
    "612241": "",
    "610899": "",
    "611313": "Congratulations and thanks for sharing!"
  }
}