{
  "id": 587390,
  "title": "24th Place Silver Medal Solution",
  "url": "/competitions/waveform-inversion/writeups/sshiyu-24th-place-solution",
  "author_name": "",
  "post_date": "2025-07-01T06:56:47.263Z",
  "votes": 17,
  "comment_count": 4,
  "views": 0,
  "content": "<p>Hi Everyone, I would like to share my solution as well as the trick I used to boost my score.</p>\n<h1>Overview</h1>\n<ul>\n<li>Model Architecture: <a href=\"https://www.kaggle.com/code/brendanartley/caformer-full-resolution-improved\" target=\"_blank\">Unet with CAFormer Encoder</a></li>\n<li>Public LB Score: 16.4</li>\n<li>Private LB Score: 16.4</li>\n</ul>\n<h1>Introduction</h1>\n<p>Something that stood out for me during the competition was that an almost exact reproduction of the forward modelling simulation code used by the hosts was open-sourced <a href=\"https://www.kaggle.com/code/manatoyo/improved-vel-to-seis\" target=\"_blank\">here</a> .</p>\n<p>This means that given a set of velocity maps, we can use this code to accurately generate its corresponding seismic data pair. This allows us to create a synthetic dataset of extra data to train our model on.</p>\n<p>Then comes the next question: What set of velocity maps should we use? One approach is to augment the existing velocity maps. Alternatively, we could train a generator model to create new velocity maps.</p>\n<p>I pondered over this question for a long time, I wanted a set of velocity maps that had a potential to teach the model useful information that would greatly boost its performance.</p>\n<p>Hmmm……If only I had access to the velocity maps of the test set. That would be great. But wait, I do have access to something similar! <strong><em>The model's predicted test set velocity maps.</em></strong></p>\n<h1>The Trick: Pseudo-Labelling</h1>\n<p>Using the forward modelling simulation code, the model's predicted test set velocity maps can be used to reconstruct a synthetic test set that largely resembles the actual test set. Training the model on this synthetic test set greatly enhances performance on the actual test set.</p>\n<p>Methodology:</p>\n<ol>\n<li>Use current best model to predict test set velocity maps<ul>\n<li>Best model is selected based on feedback from LB</li></ul></li>\n<li>Use predicted test set velocity maps to reconstruct corresponding seismic pairs to create a synthetic test set<ul>\n<li>Running the forward modelling simulation code through all the test set velocity map predictions on one CPU instance takes extremely long. So I broke them up into subsets and ran them on multiple CPU instances</li></ul></li>\n<li>Train new model using synthetic test set<ul>\n<li>Initialise training with the current best model to reduce training time</li></ul></li>\n</ol>\n<p>This process can be repeated multiple times to further enhance performance. I will refer to each repetition as one \"cycle\".</p>\n<p>Every time we get a better model, the predicted test set velocity maps also get closer to the actual test set velocity maps. Hence, the more cycles we run, the more similar our synthetic test set will be to the actual test set. This results in further performance increases every cycle.</p>\n<p>The intuition behind this idea can be summarised as follows:</p>\n<ul>\n<li>Cycle 0 Model<ul>\n<li>Here are my predictions for the test set velocity maps.</li></ul></li>\n<li>Synthetic test set<ul>\n<li>Unfortunately, your predictions are slightly off. Here is what the seismic data for the predicted test set velocity maps you have given me should look like.</li></ul></li>\n<li>Cycle 1 Model<ul>\n<li>I see! I know what went wrong now! </li>\n<li>I have learnt from my mistakes. Here is my new predictions for the test set velocity maps.</li></ul></li>\n</ul>\n<p>Essentially, the forward modelling simulation code is acting as a teacher to the model. This is only possible due how well the forward modelling simulation code can reconstruct the seismic data from the velocity maps.</p>\n<p>I ran a total of 6 cycles (cycle 1 to cycle 6) and the results are shown below.<br>\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14897182%2F522ca7a451d3f178e0f1b5c86abf4405%2Fdownload.png?generation=1751331349475484&amp;alt=media\" alt=\"\"></p>\n<h1>Other notes</h1>\n<p>I made certain changes to the methodology detailed above in certain cycles mainly because I wanted to try out some ideas that I thought were promising:</p>\n<ul>\n<li>Cycle1: Additionally included the entire original OpenFWI dataset</li>\n<li>Cycle4: Additionally included data from the previous 3 cycles as well</li>\n<li>Cycle5: Additionally included approximately 14% of the original OpenFWI dataset</li>\n<li>Cycle6: Additionally included Style_A, Style_B, and CurveFault_B data from the original OpenFWI dataset</li>\n</ul>\n<p>However, in hindsight, I believe that these changes were unnecessary and training the model on only the synthetic test set for all cycles would probably have yielded the same results.</p>\n<p>Key training parameters adjustments:</p>\n<ul>\n<li>Epochs --&gt; Adjusted to take into account both the total size of the training data and my sleep schedule. Ensuring that the code runs in reasonable time and that I am always running code 24/7.</li>\n<li>Learning rate: 1e-4 --&gt; Lowered to keep training stable and prevent NaNs</li>\n<li>ConstantCosineLR pct_cosine: 0.9 --&gt; Increased to start decreasing learning rate earlier to account for the fact that we are using a pre-trained model instead of training from scratch.</li>\n</ul>\n<h1>Closing Remarks</h1>\n<p>This competition has been quite a journey, full of ups and downs. </p>\n<p>Early on, I had several ideas I was eager to explore, but unfortunately, most of them didn’t work out as I’d hoped. Despite the setbacks, I kept experimenting until I finally discovered the approach that significantly improved my score. </p>\n<p>For a while, I thought I might have a real shot at earning my first gold medal. However, in the final stretch, many teams surged up the leaderboard, leaving me behind.</p>\n<p>Even so, this has been a valuable learning experience, and I’m determined to come back stronger next time.</p>\n<p>I’m looking forward to seeing what strategies the top teams used.</p>\n<h1>Credits</h1>\n<p><a href=\"https://www.kaggle.com/code/brendanartley/caformer-full-resolution-improved\" target=\"_blank\">CAFormer - Full Resolution Improved</a> by <a href=\"https://www.kaggle.com/brendanartley\" target=\"_blank\">@brendanartley</a><br>\n<a href=\"https://www.kaggle.com/code/jaewook704/waveform-inversion-vel-to-seis\" target=\"_blank\">waveform-inversion : Vel to Seis</a> by <a href=\"https://www.kaggle.com/jaewook704\" target=\"_blank\">@jaewook704</a><br>\n<a href=\"https://www.kaggle.com/code/manatoyo/improved-vel-to-seis\" target=\"_blank\">Improved Vel to Seis</a> by <a href=\"https://www.kaggle.com/manatoyo\" target=\"_blank\">@manatoyo</a></p>\n<h1>Code and Other Material</h1>\n<p><a href=\"https://www.kaggle.com/code/sshiyu/final-submission-caformer-inference-only\" target=\"_blank\">Inference Notebook</a><br>\n<a href=\"https://www.kaggle.com/datasets/sshiyu/gwi-models-and-training-codes\" target=\"_blank\">Models and Training Codes</a><br>\n<a href=\"https://www.kaggle.com/datasets/sshiyu/gwi-synthetic-test-set\" target=\"_blank\">Best Synthetic Test Set</a></p>",
  "messages": [
    {
      "id": "3237130",
      "postDate": "07/01/2025 00:06:27",
      "content": "<p>Hi Everyone, I would like to share my solution as well as the trick I used to boost my score.</p>\n<h1>Overview</h1>\n<ul>\n<li>Model Architecture: <a href=\"https://www.kaggle.com/code/brendanartley/caformer-full-resolution-improved\" target=\"_blank\">Unet with CAFormer Encoder</a></li>\n<li>Public LB Score: 16.4</li>\n<li>Private LB Score: 16.4</li>\n</ul>\n<h1>Introduction</h1>\n<p>Something that stood out for me during the competition was that an almost exact reproduction of the forward modelling simulation code used by the hosts was open-sourced <a href=\"https://www.kaggle.com/code/manatoyo/improved-vel-to-seis\" target=\"_blank\">here</a> .</p>\n<p>This means that given a set of velocity maps, we can use this code to accurately generate its corresponding seismic data pair. This allows us to create a synthetic dataset of extra data to train our model on.</p>\n<p>Then comes the next question: What set of velocity maps should we use? One approach is to augment the existing velocity maps. Alternatively, we could train a generator model to create new velocity maps.</p>\n<p>I pondered over this question for a long time, I wanted a set of velocity maps that had a potential to teach the model useful information that would greatly boost its performance.</p>\n<p>Hmmm……If only I had access to the velocity maps of the test set. That would be great. But wait, I do have access to something similar! <strong><em>The model's predicted test set velocity maps.</em></strong></p>\n<h1>The Trick: Pseudo-Labelling</h1>\n<p>Using the forward modelling simulation code, the model's predicted test set velocity maps can be used to reconstruct a synthetic test set that largely resembles the actual test set. Training the model on this synthetic test set greatly enhances performance on the actual test set.</p>\n<p>Methodology:</p>\n<ol>\n<li>Use current best model to predict test set velocity maps<ul>\n<li>Best model is selected based on feedback from LB</li></ul></li>\n<li>Use predicted test set velocity maps to reconstruct corresponding seismic pairs to create a synthetic test set<ul>\n<li>Running the forward modelling simulation code through all the test set velocity map predictions on one CPU instance takes extremely long. So I broke them up into subsets and ran them on multiple CPU instances</li></ul></li>\n<li>Train new model using synthetic test set<ul>\n<li>Initialise training with the current best model to reduce training time</li></ul></li>\n</ol>\n<p>This process can be repeated multiple times to further enhance performance. I will refer to each repetition as one \"cycle\".</p>\n<p>Every time we get a better model, the predicted test set velocity maps also get closer to the actual test set velocity maps. Hence, the more cycles we run, the more similar our synthetic test set will be to the actual test set. This results in further performance increases every cycle.</p>\n<p>The intuition behind this idea can be summarised as follows:</p>\n<ul>\n<li>Cycle 0 Model<ul>\n<li>Here are my predictions for the test set velocity maps.</li></ul></li>\n<li>Synthetic test set<ul>\n<li>Unfortunately, your predictions are slightly off. Here is what the seismic data for the predicted test set velocity maps you have given me should look like.</li></ul></li>\n<li>Cycle 1 Model<ul>\n<li>I see! I know what went wrong now! </li>\n<li>I have learnt from my mistakes. Here is my new predictions for the test set velocity maps.</li></ul></li>\n</ul>\n<p>Essentially, the forward modelling simulation code is acting as a teacher to the model. This is only possible due how well the forward modelling simulation code can reconstruct the seismic data from the velocity maps.</p>\n<p>I ran a total of 6 cycles (cycle 1 to cycle 6) and the results are shown below.<br>\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14897182%2F522ca7a451d3f178e0f1b5c86abf4405%2Fdownload.png?generation=1751331349475484&amp;alt=media\" alt=\"\"></p>\n<h1>Other notes</h1>\n<p>I made certain changes to the methodology detailed above in certain cycles mainly because I wanted to try out some ideas that I thought were promising:</p>\n<ul>\n<li>Cycle1: Additionally included the entire original OpenFWI dataset</li>\n<li>Cycle4: Additionally included data from the previous 3 cycles as well</li>\n<li>Cycle5: Additionally included approximately 14% of the original OpenFWI dataset</li>\n<li>Cycle6: Additionally included Style_A, Style_B, and CurveFault_B data from the original OpenFWI dataset</li>\n</ul>\n<p>However, in hindsight, I believe that these changes were unnecessary and training the model on only the synthetic test set for all cycles would probably have yielded the same results.</p>\n<p>Key training parameters adjustments:</p>\n<ul>\n<li>Epochs --&gt; Adjusted to take into account both the total size of the training data and my sleep schedule. Ensuring that the code runs in reasonable time and that I am always running code 24/7.</li>\n<li>Learning rate: 1e-4 --&gt; Lowered to keep training stable and prevent NaNs</li>\n<li>ConstantCosineLR pct_cosine: 0.9 --&gt; Increased to start decreasing learning rate earlier to account for the fact that we are using a pre-trained model instead of training from scratch.</li>\n</ul>\n<h1>Closing Remarks</h1>\n<p>This competition has been quite a journey, full of ups and downs. </p>\n<p>Early on, I had several ideas I was eager to explore, but unfortunately, most of them didn’t work out as I’d hoped. Despite the setbacks, I kept experimenting until I finally discovered the approach that significantly improved my score. </p>\n<p>For a while, I thought I might have a real shot at earning my first gold medal. However, in the final stretch, many teams surged up the leaderboard, leaving me behind.</p>\n<p>Even so, this has been a valuable learning experience, and I’m determined to come back stronger next time.</p>\n<p>I’m looking forward to seeing what strategies the top teams used.</p>\n<h1>Credits</h1>\n<p><a href=\"https://www.kaggle.com/code/brendanartley/caformer-full-resolution-improved\" target=\"_blank\">CAFormer - Full Resolution Improved</a> by <a href=\"https://www.kaggle.com/brendanartley\" target=\"_blank\">@brendanartley</a><br>\n<a href=\"https://www.kaggle.com/code/jaewook704/waveform-inversion-vel-to-seis\" target=\"_blank\">waveform-inversion : Vel to Seis</a> by <a href=\"https://www.kaggle.com/jaewook704\" target=\"_blank\">@jaewook704</a><br>\n<a href=\"https://www.kaggle.com/code/manatoyo/improved-vel-to-seis\" target=\"_blank\">Improved Vel to Seis</a> by <a href=\"https://www.kaggle.com/manatoyo\" target=\"_blank\">@manatoyo</a></p>\n<h1>Code and Other Material</h1>\n<p><a href=\"https://www.kaggle.com/code/sshiyu/final-submission-caformer-inference-only\" target=\"_blank\">Inference Notebook</a><br>\n<a href=\"https://www.kaggle.com/datasets/sshiyu/gwi-models-and-training-codes\" target=\"_blank\">Models and Training Codes</a><br>\n<a href=\"https://www.kaggle.com/datasets/sshiyu/gwi-synthetic-test-set\" target=\"_blank\">Best Synthetic Test Set</a></p>",
      "rawMarkdown": "Hi Everyone, I would like to share my solution as well as the trick I used to boost my score.\n\n# Overview\n- Model Architecture: [Unet with CAFormer Encoder](https://www.kaggle.com/code/brendanartley/caformer-full-resolution-improved)\n- Public LB Score: 16.4\n- Private LB Score: 16.4\n\n# Introduction\nSomething that stood out for me during the competition was that an almost exact reproduction of the forward modelling simulation code used by the hosts was open-sourced [here](https://www.kaggle.com/code/manatoyo/improved-vel-to-seis) .\n\nThis means that given a set of velocity maps, we can use this code to accurately generate its corresponding seismic data pair. This allows us to create a synthetic dataset of extra data to train our model on.\n\nThen comes the next question: What set of velocity maps should we use? One approach is to augment the existing velocity maps. Alternatively, we could train a generator model to create new velocity maps.\n\nI pondered over this question for a long time, I wanted a set of velocity maps that had a potential to teach the model useful information that would greatly boost its performance.\n\nHmmm......If only I had access to the velocity maps of the test set. That would be great. But wait, I do have access to something similar! ***The model's predicted test set velocity maps.***\n\n# The Trick: Pseudo-Labelling\nUsing the forward modelling simulation code, the model's predicted test set velocity maps can be used to reconstruct a synthetic test set that largely resembles the actual test set. Training the model on this synthetic test set greatly enhances performance on the actual test set.\n\nMethodology:\n1. Use current best model to predict test set velocity maps\n\t- Best model is selected based on feedback from LB\n2. Use predicted test set velocity maps to reconstruct corresponding seismic pairs to create a synthetic test set\n\t- Running the forward modelling simulation code through all the test set velocity map predictions on one CPU instance takes extremely long. So I broke them up into subsets and ran them on multiple CPU instances\n3. Train new model using synthetic test set\n\t- Initialise training with the current best model to reduce training time\n\nThis process can be repeated multiple times to further enhance performance. I will refer to each repetition as one \"cycle\".\n\nEvery time we get a better model, the predicted test set velocity maps also get closer to the actual test set velocity maps. Hence, the more cycles we run, the more similar our synthetic test set will be to the actual test set. This results in further performance increases every cycle.\n\nThe intuition behind this idea can be summarised as follows:\n- Cycle 0 Model\n\t- Here are my predictions for the test set velocity maps.\n- Synthetic test set\n\t- Unfortunately, your predictions are slightly off. Here is what the seismic data for the predicted test set velocity maps you have given me should look like.\n- Cycle 1 Model\n\t- I see! I know what went wrong now! \n\t- I have learnt from my mistakes. Here is my new predictions for the test set velocity maps.\n\nEssentially, the forward modelling simulation code is acting as a teacher to the model. This is only possible due how well the forward modelling simulation code can reconstruct the seismic data from the velocity maps.\n\nI ran a total of 6 cycles (cycle 1 to cycle 6) and the results are shown below.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14897182%2F522ca7a451d3f178e0f1b5c86abf4405%2Fdownload.png?generation=1751331349475484&alt=media)\n\n# Other notes\nI made certain changes to the methodology detailed above in certain cycles mainly because I wanted to try out some ideas that I thought were promising:\n- Cycle1: Additionally included the entire original OpenFWI dataset\n- Cycle4: Additionally included data from the previous 3 cycles as well\n- Cycle5: Additionally included approximately 14% of the original OpenFWI dataset\n- Cycle6: Additionally included Style_A, Style_B, and CurveFault_B data from the original OpenFWI dataset\n\nHowever, in hindsight, I believe that these changes were unnecessary and training the model on only the synthetic test set for all cycles would probably have yielded the same results.\n\nKey training parameters adjustments:\n- Epochs --> Adjusted to take into account both the total size of the training data and my sleep schedule. Ensuring that the code runs in reasonable time and that I am always running code 24/7.\n- Learning rate: 1e-4 --> Lowered to keep training stable and prevent NaNs\n- ConstantCosineLR pct_cosine: 0.9 --> Increased to start decreasing learning rate earlier to account for the fact that we are using a pre-trained model instead of training from scratch.\n\n# Closing Remarks\nThis competition has been quite a journey, full of ups and downs. \n\nEarly on, I had several ideas I was eager to explore, but unfortunately, most of them didn’t work out as I’d hoped. Despite the setbacks, I kept experimenting until I finally discovered the approach that significantly improved my score. \n\nFor a while, I thought I might have a real shot at earning my first gold medal. However, in the final stretch, many teams surged up the leaderboard, leaving me behind.\n\nEven so, this has been a valuable learning experience, and I’m determined to come back stronger next time.\n\nI’m looking forward to seeing what strategies the top teams used.\n\n# Credits\n[CAFormer - Full Resolution Improved](https://www.kaggle.com/code/brendanartley/caformer-full-resolution-improved) by @brendanartley\n[waveform-inversion : Vel to Seis](https://www.kaggle.com/code/jaewook704/waveform-inversion-vel-to-seis) by @jaewook704\n[Improved Vel to Seis](https://www.kaggle.com/code/manatoyo/improved-vel-to-seis) by @manatoyo\n\n# Code and Other Material\n[Inference Notebook](https://www.kaggle.com/code/sshiyu/final-submission-caformer-inference-only)\n[Models and Training Codes](https://www.kaggle.com/datasets/sshiyu/gwi-models-and-training-codes)\n[Best Synthetic Test Set](https://www.kaggle.com/datasets/sshiyu/gwi-synthetic-test-set)",
      "votes": null
    },
    {
      "id": "3237148",
      "postDate": "07/01/2025 00:19:35",
      "content": "<p>Thank you for sharing. This idea is great！</p>",
      "rawMarkdown": "Thank you for sharing. This idea is great！",
      "votes": null
    },
    {
      "id": "3237153",
      "postDate": "07/01/2025 00:21:57",
      "content": "<p>Congratulations on your accomplishment you made! Your idea is fascinating to add bagging during the training cycle! Very nice idea that we could learn from!🫡</p>",
      "rawMarkdown": "Congratulations on your accomplishment you made! Your idea is fascinating to add bagging during the training cycle! Very nice idea that we could learn from!🫡",
      "votes": null
    },
    {
      "id": "3237167",
      "postDate": "07/01/2025 00:29:34",
      "content": "<p>Very cool take on pseudo-labelling! And a testament to how neat this competition was -- that just brute force of massive hardware was not the right take here, that an elegant take as yours could perform so well, even amidst so much data.</p>\n<p>Congrats on the terrific performance and thanks for the write-up! 🙂</p>",
      "rawMarkdown": "Very cool take on pseudo-labelling! And a testament to how neat this competition was -- that just brute force of massive hardware was not the right take here, that an elegant take as yours could perform so well, even amidst so much data.\n\nCongrats on the terrific performance and thanks for the write-up! 🙂",
      "votes": null
    },
    {
      "id": "3237627",
      "postDate": "07/01/2025 07:45:30",
      "content": "<p>I wish i realize this.<br>\nYour explanation is easy to understand.<br>\nThanks.</p>",
      "rawMarkdown": "I wish i realize this.\nYour explanation is easy to understand.\nThanks.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 3237148,
      "author_name": "potonglantie93",
      "author_url": "",
      "post_date": "07/01/2025 00:19:35",
      "content": "<p>Thank you for sharing. This idea is great！</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3237153,
      "author_name": "huasteven",
      "author_url": "",
      "post_date": "07/01/2025 00:21:57",
      "content": "<p>Congratulations on your accomplishment you made! Your idea is fascinating to add bagging during the training cycle! Very nice idea that we could learn from!🫡</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3237167,
      "author_name": "radek1",
      "author_url": "",
      "post_date": "07/01/2025 00:29:34",
      "content": "<p>Very cool take on pseudo-labelling! And a testament to how neat this competition was -- that just brute force of massive hardware was not the right take here, that an elegant take as yours could perform so well, even amidst so much data.</p>\n<p>Congrats on the terrific performance and thanks for the write-up! 🙂</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 3237627,
      "author_name": "overvalueawareness",
      "author_url": "",
      "post_date": "07/01/2025 07:45:30",
      "content": "<p>I wish i realize this.<br>\nYour explanation is easy to understand.<br>\nThanks.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "3237130": "Hi Everyone, I would like to share my solution as well as the trick I used to boost my score.\n\n# Overview\n- Model Architecture: [Unet with CAFormer Encoder](https://www.kaggle.com/code/brendanartley/caformer-full-resolution-improved)\n- Public LB Score: 16.4\n- Private LB Score: 16.4\n\n# Introduction\nSomething that stood out for me during the competition was that an almost exact reproduction of the forward modelling simulation code used by the hosts was open-sourced [here](https://www.kaggle.com/code/manatoyo/improved-vel-to-seis) .\n\nThis means that given a set of velocity maps, we can use this code to accurately generate its corresponding seismic data pair. This allows us to create a synthetic dataset of extra data to train our model on.\n\nThen comes the next question: What set of velocity maps should we use? One approach is to augment the existing velocity maps. Alternatively, we could train a generator model to create new velocity maps.\n\nI pondered over this question for a long time, I wanted a set of velocity maps that had a potential to teach the model useful information that would greatly boost its performance.\n\nHmmm......If only I had access to the velocity maps of the test set. That would be great. But wait, I do have access to something similar! ***The model's predicted test set velocity maps.***\n\n# The Trick: Pseudo-Labelling\nUsing the forward modelling simulation code, the model's predicted test set velocity maps can be used to reconstruct a synthetic test set that largely resembles the actual test set. Training the model on this synthetic test set greatly enhances performance on the actual test set.\n\nMethodology:\n1. Use current best model to predict test set velocity maps\n\t- Best model is selected based on feedback from LB\n2. Use predicted test set velocity maps to reconstruct corresponding seismic pairs to create a synthetic test set\n\t- Running the forward modelling simulation code through all the test set velocity map predictions on one CPU instance takes extremely long. So I broke them up into subsets and ran them on multiple CPU instances\n3. Train new model using synthetic test set\n\t- Initialise training with the current best model to reduce training time\n\nThis process can be repeated multiple times to further enhance performance. I will refer to each repetition as one \"cycle\".\n\nEvery time we get a better model, the predicted test set velocity maps also get closer to the actual test set velocity maps. Hence, the more cycles we run, the more similar our synthetic test set will be to the actual test set. This results in further performance increases every cycle.\n\nThe intuition behind this idea can be summarised as follows:\n- Cycle 0 Model\n\t- Here are my predictions for the test set velocity maps.\n- Synthetic test set\n\t- Unfortunately, your predictions are slightly off. Here is what the seismic data for the predicted test set velocity maps you have given me should look like.\n- Cycle 1 Model\n\t- I see! I know what went wrong now! \n\t- I have learnt from my mistakes. Here is my new predictions for the test set velocity maps.\n\nEssentially, the forward modelling simulation code is acting as a teacher to the model. This is only possible due how well the forward modelling simulation code can reconstruct the seismic data from the velocity maps.\n\nI ran a total of 6 cycles (cycle 1 to cycle 6) and the results are shown below.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14897182%2F522ca7a451d3f178e0f1b5c86abf4405%2Fdownload.png?generation=1751331349475484&alt=media)\n\n# Other notes\nI made certain changes to the methodology detailed above in certain cycles mainly because I wanted to try out some ideas that I thought were promising:\n- Cycle1: Additionally included the entire original OpenFWI dataset\n- Cycle4: Additionally included data from the previous 3 cycles as well\n- Cycle5: Additionally included approximately 14% of the original OpenFWI dataset\n- Cycle6: Additionally included Style_A, Style_B, and CurveFault_B data from the original OpenFWI dataset\n\nHowever, in hindsight, I believe that these changes were unnecessary and training the model on only the synthetic test set for all cycles would probably have yielded the same results.\n\nKey training parameters adjustments:\n- Epochs --> Adjusted to take into account both the total size of the training data and my sleep schedule. Ensuring that the code runs in reasonable time and that I am always running code 24/7.\n- Learning rate: 1e-4 --> Lowered to keep training stable and prevent NaNs\n- ConstantCosineLR pct_cosine: 0.9 --> Increased to start decreasing learning rate earlier to account for the fact that we are using a pre-trained model instead of training from scratch.\n\n# Closing Remarks\nThis competition has been quite a journey, full of ups and downs. \n\nEarly on, I had several ideas I was eager to explore, but unfortunately, most of them didn’t work out as I’d hoped. Despite the setbacks, I kept experimenting until I finally discovered the approach that significantly improved my score. \n\nFor a while, I thought I might have a real shot at earning my first gold medal. However, in the final stretch, many teams surged up the leaderboard, leaving me behind.\n\nEven so, this has been a valuable learning experience, and I’m determined to come back stronger next time.\n\nI’m looking forward to seeing what strategies the top teams used.\n\n# Credits\n[CAFormer - Full Resolution Improved](https://www.kaggle.com/code/brendanartley/caformer-full-resolution-improved) by @brendanartley\n[waveform-inversion : Vel to Seis](https://www.kaggle.com/code/jaewook704/waveform-inversion-vel-to-seis) by @jaewook704\n[Improved Vel to Seis](https://www.kaggle.com/code/manatoyo/improved-vel-to-seis) by @manatoyo\n\n# Code and Other Material\n[Inference Notebook](https://www.kaggle.com/code/sshiyu/final-submission-caformer-inference-only)\n[Models and Training Codes](https://www.kaggle.com/datasets/sshiyu/gwi-models-and-training-codes)\n[Best Synthetic Test Set](https://www.kaggle.com/datasets/sshiyu/gwi-synthetic-test-set)",
    "3237148": "Thank you for sharing. This idea is great！",
    "3237153": "Congratulations on your accomplishment you made! Your idea is fascinating to add bagging during the training cycle! Very nice idea that we could learn from!🫡",
    "3237167": "Very cool take on pseudo-labelling! And a testament to how neat this competition was -- that just brute force of massive hardware was not the right take here, that an elegant take as yours could perform so well, even amidst so much data.\n\nCongrats on the terrific performance and thanks for the write-up! 🙂",
    "3237627": "I wish i realize this.\nYour explanation is easy to understand.\nThanks."
  },
  "source": "meta"
}