{
  "id": 347692,
  "title": "4th Place Solution - Team ...",
  "content": "<p>Congrats all and thank you Georgia State University, Kaggle and all the organizers for hosting such an amazing competition. We were unfortunate to finish just short of a prize in both tracks of the competition, but will take the learnings with us!</p>\n<h3>TL;DR</h3>\n<p>Our solution is based on deberta-v3, mlm, pseudo labeling and stacking with LGB. We found the combination of a number of NLP improvements added up to a solid score. </p>\n<h3>Pre/Data processing</h3>\n<p>The core of our solution was to combine, in order, all discourse ids, and then start and finish them with discourse typeids and special tokens. <br>\nA cls_position was used as start or end of the discourse. In python, see below, </p>\n<pre><code>input_ids = []\nessay_df = = trndf.loc[essay_id]\nfor i in range(len(essay_df)):\n   text = f'{discourse_types[i]}: {discourse_texts[i]} {self.tokenizer.sep_token} :{discourse_types[i]}'\n   i_ids = self.tokenizer.encode(text, add_special_tokens=False)\n   input_ids += i_ids\n   cls_pos += [0] * (len(i_ids) - 1) + [1]\n</code></pre>\n<p>An example of the output can be seen below. </p>\n<pre><code>Lead: Computers can do many things for us. The idea that a computer can read your emotions is amazing  [SEP] :Lead Position: I do not belive it is true. I will believe it when I see it.  [SEP] :Position Evidence: In paragraph 8 it says \" But in a false smile, the mouth is stretched sideways ising the zygomatic major and different muscle, the risorius.\" however this may be true for most people; there has to be someone out there in our world of 7 billion that smiles there smiles with their zygomatic muscle or their risorius muscle  [SEP] :Evidence Claim: Everyone has diffrent emotions and everyone shows them diffrently  [SEP] :Claim Counterclaim: The muscles in our face does say a lot about the emotions we are feeling.  [SEP] :Counterclaim Concluding Statement: This is why I believe computures can not read your emotions  [SEP] :Concluding Statement\n</code></pre>\n<p>Auxiliary labels such as ranking (Ineffective -&gt; Adequate -&gt; Effective) and essay topic cluster were also used. <br>\nWe also added the essay text, which was not in annotated discourses to the end, and sometimes positioned in order between discourses. <br>\nReplacing line breaks with special tokens and cleaning text in some models was found to increase diversity significantly in the overall blend. </p>\n<h3>Level1 Models</h3>\n<p>We used three different model pipelines, with some smaller changes in data preprocessing, along with different auxiliary labels and model heads. We only used <code>deberta-v3</code> as the backbone. Other backbones did not help our blend in CV. </p>\n<h6>Model1,</h6>\n<ul>\n<li>Non discourse essay text moved to the back of input, and text cleaned with line breaks added.  </li>\n<li>Used auxiliary targets of rank (rmse loss) and essay topic. Lowered auxiliary weight, from 0.4 to 0.01, as model trained. </li>\n<li>Linear head extracting the first token of each discourse in the input, with categorical crossentropy loss.  </li>\n</ul>\n<h6>Model2,</h6>\n<ul>\n<li>Non discourse essay text between discourses. No cleaning or line breaks</li>\n<li>Used auxiliary targets of rank (rmse loss). Weight of auxiliary loss ~0.2. </li>\n<li>Linear head extracting the last token of each discourse in the input, with categorical crossentropy loss.  </li>\n</ul>\n<h6>Model3,</h6>\n<ul>\n<li>Non discourse essay text between discourses. No cleaning or line breaks</li>\n<li>Used auxiliary targets of rank (rmse loss).  Weight of auxiliary loss ~0.2. </li>\n<li>This was actually two models - one with an rnn head applied to the mean pooling of the tokens belonging to each discourse; and one with an attention head on the same input.</li>\n</ul>\n<p>It is important to remove deberta hidden layer dropout on all models. We also found it helpful to pretrain the weights on the earlier feedback competition essays for around 20 epochs (low lr, large batchsize). <br>\nAll models were trained with 2-3 epochs, with backbone set to lr ~2e-5 and the model head was set to ~1e-4. </p>\n<h3>Level2 Models</h3>\n<p>We created meta pseudo labels on the essays from the first feedback competition (excl. current comp essays). In-fold predictions from all models were used to create an averaged in-fold prediction, which can be used as a leak-free pseudo label.<br>\nEach model was then retrained on the hard labels from current competition and the soft pseudo labels. Hard labels from current competition were upweighted in the loss function. </p>\n<h3>Stacking</h3>\n<p>All level2 model predictions were averaged and used in a lightgbm stacking model. This was trained at discourse level, along with meta features from the respective essay, such as word count, sentence count, position in essay-topic and lead &amp; lag features.<br>\nNo special postprocessing was applied after that. </p>\n<h3>What did not help</h3>\n<ul>\n<li>Other backbones such as deberta-v1, deberta-v2, t5, facebook-opt, distilled-bloom</li>\n<li>2nd or third round pseudo labelling. </li>\n<li>Training models for a more epochs (this overfit, should have tried AWP)</li>\n<li>The character decoding/encoding used in the public scripts.</li>\n<li>Model soup</li>\n<li>Test time augmentation</li>\n<li>Token dropout</li>\n<li>etc. etc. </li>\n</ul>",
  "comments": [
    {
      "id": 1913385,
      "author_name": "The Devastator",
      "author_url": "",
      "post_date": "2022-08-25T09:58:57.803000",
      "content": "<p>Congrats! your work is very impressive! <br>\nGreat writeup btw! </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 1915071,
      "author_name": "DeepUnderstanding",
      "author_url": "",
      "post_date": "2022-08-26T16:32:07.817000",
      "content": "<p><code>Auxiliary labels such as ranking (Ineffective -&gt; Adequate -&gt; Effective)</code><br>\nHow did you make rmseloss to rank them?</p>",
      "votes": 0,
      "replies": [
        {
          "id": 1915105,
          "author_name": "Darragh",
          "author_url": "",
          "post_date": "2022-08-26T17:01:49.887000",
          "content": "<p>Create a map, like <code>{'Ineffective': 0, 'Adequate': 1, 'Effective': 2}</code> for the target and now you have one continuous label instead of categorical labels. </p>",
          "votes": 0,
          "replies": []
        }
      ]
    }
  ],
  "comment_count": 3,
  "messages": [
    {
      "id": 1913108,
      "postDate": "2022-08-25T06:35:10.913Z",
      "content": "<p>Congrats all and thank you Georgia State University, Kaggle and all the organizers for hosting such an amazing competition. We were unfortunate to finish just short of a prize in both tracks of the competition, but will take the learnings with us!</p>\n<h3>TL;DR</h3>\n<p>Our solution is based on deberta-v3, mlm, pseudo labeling and stacking with LGB. We found the combination of a number of NLP improvements added up to a solid score. </p>\n<h3>Pre/Data processing</h3>\n<p>The core of our solution was to combine, in order, all discourse ids, and then start and finish them with discourse typeids and special tokens. <br>\nA cls_position was used as start or end of the discourse. In python, see below, </p>\n<pre><code>input_ids = []\nessay_df = = trndf.loc[essay_id]\nfor i in range(len(essay_df)):\n   text = f'{discourse_types[i]}: {discourse_texts[i]} {self.tokenizer.sep_token} :{discourse_types[i]}'\n   i_ids = self.tokenizer.encode(text, add_special_tokens=False)\n   input_ids += i_ids\n   cls_pos += [0] * (len(i_ids) - 1) + [1]\n</code></pre>\n<p>An example of the output can be seen below. </p>\n<pre><code>Lead: Computers can do many things for us. The idea that a computer can read your emotions is amazing  [SEP] :Lead Position: I do not belive it is true. I will believe it when I see it.  [SEP] :Position Evidence: In paragraph 8 it says \" But in a false smile, the mouth is stretched sideways ising the zygomatic major and different muscle, the risorius.\" however this may be true for most people; there has to be someone out there in our world of 7 billion that smiles there smiles with their zygomatic muscle or their risorius muscle  [SEP] :Evidence Claim: Everyone has diffrent emotions and everyone shows them diffrently  [SEP] :Claim Counterclaim: The muscles in our face does say a lot about the emotions we are feeling.  [SEP] :Counterclaim Concluding Statement: This is why I believe computures can not read your emotions  [SEP] :Concluding Statement\n</code></pre>\n<p>Auxiliary labels such as ranking (Ineffective -&gt; Adequate -&gt; Effective) and essay topic cluster were also used. <br>\nWe also added the essay text, which was not in annotated discourses to the end, and sometimes positioned in order between discourses. <br>\nReplacing line breaks with special tokens and cleaning text in some models was found to increase diversity significantly in the overall blend. </p>\n<h3>Level1 Models</h3>\n<p>We used three different model pipelines, with some smaller changes in data preprocessing, along with different auxiliary labels and model heads. We only used <code>deberta-v3</code> as the backbone. Other backbones did not help our blend in CV. </p>\n<h6>Model1,</h6>\n<ul>\n<li>Non discourse essay text moved to the back of input, and text cleaned with line breaks added.  </li>\n<li>Used auxiliary targets of rank (rmse loss) and essay topic. Lowered auxiliary weight, from 0.4 to 0.01, as model trained. </li>\n<li>Linear head extracting the first token of each discourse in the input, with categorical crossentropy loss.  </li>\n</ul>\n<h6>Model2,</h6>\n<ul>\n<li>Non discourse essay text between discourses. No cleaning or line breaks</li>\n<li>Used auxiliary targets of rank (rmse loss). Weight of auxiliary loss ~0.2. </li>\n<li>Linear head extracting the last token of each discourse in the input, with categorical crossentropy loss.  </li>\n</ul>\n<h6>Model3,</h6>\n<ul>\n<li>Non discourse essay text between discourses. No cleaning or line breaks</li>\n<li>Used auxiliary targets of rank (rmse loss).  Weight of auxiliary loss ~0.2. </li>\n<li>This was actually two models - one with an rnn head applied to the mean pooling of the tokens belonging to each discourse; and one with an attention head on the same input.</li>\n</ul>\n<p>It is important to remove deberta hidden layer dropout on all models. We also found it helpful to pretrain the weights on the earlier feedback competition essays for around 20 epochs (low lr, large batchsize). <br>\nAll models were trained with 2-3 epochs, with backbone set to lr ~2e-5 and the model head was set to ~1e-4. </p>\n<h3>Level2 Models</h3>\n<p>We created meta pseudo labels on the essays from the first feedback competition (excl. current comp essays). In-fold predictions from all models were used to create an averaged in-fold prediction, which can be used as a leak-free pseudo label.<br>\nEach model was then retrained on the hard labels from current competition and the soft pseudo labels. Hard labels from current competition were upweighted in the loss function. </p>\n<h3>Stacking</h3>\n<p>All level2 model predictions were averaged and used in a lightgbm stacking model. This was trained at discourse level, along with meta features from the respective essay, such as word count, sentence count, position in essay-topic and lead &amp; lag features.<br>\nNo special postprocessing was applied after that. </p>\n<h3>What did not help</h3>\n<ul>\n<li>Other backbones such as deberta-v1, deberta-v2, t5, facebook-opt, distilled-bloom</li>\n<li>2nd or third round pseudo labelling. </li>\n<li>Training models for a more epochs (this overfit, should have tried AWP)</li>\n<li>The character decoding/encoding used in the public scripts.</li>\n<li>Model soup</li>\n<li>Test time augmentation</li>\n<li>Token dropout</li>\n<li>etc. etc. </li>\n</ul>",
      "rawMarkdown": "\nCongrats all and thank you Georgia State University, Kaggle and all the organizers for hosting such an amazing competition. We were unfortunate to finish just short of a prize in both tracks of the competition, but will take the learnings with us!\n### TL;DR\nOur solution is based on deberta-v3, mlm, pseudo labeling and stacking with LGB. We found the combination of a number of NLP improvements added up to a solid score. \n\n### Pre/Data processing\nThe core of our solution was to combine, in order, all discourse ids, and then start and finish them with discourse typeids and special tokens. \nA cls_position was used as start or end of the discourse. In python, see below, \n```\ninput_ids = []\nessay_df = = trndf.loc[essay_id]\nfor i in range(len(essay_df)):\n    text = f'{discourse_types[i]}: {discourse_texts[i]} {self.tokenizer.sep_token} :{discourse_types[i]}'\n    i_ids = self.tokenizer.encode(text, add_special_tokens=False)\n    input_ids += i_ids\n    cls_pos += [0] * (len(i_ids) - 1) + [1]\n```\n\nAn example of the output can be seen below. \n ```\nLead: Computers can do many things for us. The idea that a computer can read your emotions is amazing  [SEP] :Lead Position: I do not belive it is true. I will believe it when I see it.  [SEP] :Position Evidence: In paragraph 8 it says \" But in a false smile, the mouth is stretched sideways ising the zygomatic major and different muscle, the risorius.\" however this may be true for most people; there has to be someone out there in our world of 7 billion that smiles there smiles with their zygomatic muscle or their risorius muscle  [SEP] :Evidence Claim: Everyone has diffrent emotions and everyone shows them diffrently  [SEP] :Claim Counterclaim: The muscles in our face does say a lot about the emotions we are feeling.  [SEP] :Counterclaim Concluding Statement: This is why I believe computures can not read your emotions  [SEP] :Concluding Statement\n```\n\nAuxiliary labels such as ranking (Ineffective -> Adequate -> Effective) and essay topic cluster were also used. \nWe also added the essay text, which was not in annotated discourses to the end, and sometimes positioned in order between discourses. \nReplacing line breaks with special tokens and cleaning text in some models was found to increase diversity significantly in the overall blend. \n\n### Level1 Models\nWe used three different model pipelines, with some smaller changes in data preprocessing, along with different auxiliary labels and model heads. We only used `deberta-v3` as the backbone. Other backbones did not help our blend in CV. \n\n###### Model1, \n- Non discourse essay text moved to the back of input, and text cleaned with line breaks added.  \n- Used auxiliary targets of rank (rmse loss) and essay topic. Lowered auxiliary weight, from 0.4 to 0.01, as model trained. \n- Linear head extracting the first token of each discourse in the input, with categorical crossentropy loss.  \n###### Model2, \n- Non discourse essay text between discourses. No cleaning or line breaks\n- Used auxiliary targets of rank (rmse loss). Weight of auxiliary loss ~0.2. \n- Linear head extracting the last token of each discourse in the input, with categorical crossentropy loss.  \n###### Model3, \n- Non discourse essay text between discourses. No cleaning or line breaks\n- Used auxiliary targets of rank (rmse loss).  Weight of auxiliary loss ~0.2. \n- This was actually two models - one with an rnn head applied to the mean pooling of the tokens belonging to each discourse; and one with an attention head on the same input.\n   \nIt is important to remove deberta hidden layer dropout on all models. We also found it helpful to pretrain the weights on the earlier feedback competition essays for around 20 epochs (low lr, large batchsize). \nAll models were trained with 2-3 epochs, with backbone set to lr ~2e-5 and the model head was set to ~1e-4. \n### Level2 Models\nWe created meta pseudo labels on the essays from the first feedback competition (excl. current comp essays). In-fold predictions from all models were used to create an averaged in-fold prediction, which can be used as a leak-free pseudo label.\n\nEach model was then retrained on the hard labels from current competition and the soft pseudo labels. Hard labels from current competition were upweighted in the loss function. \n### Stacking\nAll level2 model predictions were averaged and used in a lightgbm stacking model. This was trained at discourse level, along with meta features from the respective essay, such as word count, sentence count, position in essay-topic and lead & lag features.\n\nNo special postprocessing was applied after that. \n### What did not help\n- Other backbones such as deberta-v1, deberta-v2, t5, facebook-opt, distilled-bloom\n- 2nd or third round pseudo labelling. \n- Training models for a more epochs (this overfit, should have tried AWP)\n- The character decoding/encoding used in the public scripts.\n- Model soup\n- Test time augmentation\n- Token dropout\n- etc. etc. \n",
      "votes": 28
    },
    {
      "id": 1913385,
      "postDate": "2022-08-25T09:58:57.803Z",
      "content": "<p>Congrats! your work is very impressive! <br>\nGreat writeup btw! </p>",
      "rawMarkdown": "Congrats! your work is very impressive! \nGreat writeup btw! ",
      "votes": 1
    },
    {
      "id": 1915071,
      "postDate": "2022-08-26T16:32:07.817Z",
      "content": "<p><code>Auxiliary labels such as ranking (Ineffective -&gt; Adequate -&gt; Effective)</code><br>\nHow did you make rmseloss to rank them?</p>",
      "rawMarkdown": "`Auxiliary labels such as ranking (Ineffective -> Adequate -> Effective)`\nHow did you make rmseloss to rank them?\n",
      "replies": [
        {
          "id": 1915105,
          "postDate": "2022-08-26T17:01:49.887Z",
          "content": "<p>Create a map, like <code>{'Ineffective': 0, 'Adequate': 1, 'Effective': 2}</code> for the target and now you have one continuous label instead of categorical labels. </p>",
          "rawMarkdown": "Create a map, like `{'Ineffective': 0, 'Adequate': 1, 'Effective': 2}` for the target and now you have one continuous label instead of categorical labels. "
        }
      ]
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-19T17:52:25Z",
  "competition_id": 35308,
  "competition_slug": "feedback-prize-effectiveness",
  "team_id": 8672631,
  "solution_url": "/competitions/feedback-prize-effectiveness/writeups/4th-place-solution-team"
}